1. References and resources

Reference

PLoS One. 2013;8(3):e59582. doi: 10.1371/journal.pone.0059582.

Machine

AWS r5.2xlarge and CentOS linux 7 on a Virtual Machine

2. Obtain and/process analysis datsets

Make directories

~/data/rnaseq/Rn/PLoS-One-8-e59582$ ls -l

drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 10 02:48 f344_pfc_nicotine

drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 10 03:28 f344_pfc_saline

Convert sra files to fastq files

f344_pfc_nicotine$ fastq-dump –split-3 SRR869032.sra –gzip

f344_pfc_nicotine$ fastq-dump –split-3 SRR869033.sra –gzip

f344_pfc_nicotine$ fastq-dump –split-3 SRR869034.sra –gzip

PLoS-One-8-e59582$ ls -l f344_pfc_nicotine/

-rw-rw-r– 1 ubuntu ubuntu 1918376826 Apr 7 13:08 SRR869032.sra

-rw-rw-r– 1 ubuntu ubuntu 1512702873 Apr 10 03:07 SRR869032_1.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 1565027421 Apr 10 03:07 SRR869032_2.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 1989086241 Apr 7 13:09 SRR869033.sra

-rw-rw-r– 1 ubuntu ubuntu 1559510818 Apr 10 03:11 SRR869033_1.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 1612258618 Apr 10 03:11 SRR869033_2.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 1978327667 Apr 7 13:10 SRR869034.sra

-rw-rw-r– 1 ubuntu ubuntu 1568979784 Apr 10 03:12 SRR869034_1.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 1615385331 Apr 10 03:12 SRR869034_2.fastq.gz

Download sra files (control/saline exposed rat PFC) to f344_pfc_saline directory

f344_pfc_saline$ fastq-dump –split-3 SRR869044.sra –gzip

f344_pfc_saline$ fastq-dump –split-3 SRR869045.sra –gzip

f344_pfc_saline$ fastq-dump –split-3 SRR869046.sra –gzip

PLoS-One-8-e59582$ ls -l f344_pfc_saline/

-rw-rw-r– 1 ubuntu ubuntu 2681330074 Apr 7 12:59 SRR869044.sra

-rw-rw-r– 1 ubuntu ubuntu 2119745955 Apr 10 03:10 SRR869044_1.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 2202580482 Apr 10 03:10 SRR869044_2.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 2709383194 Apr 7 13:01 SRR869045.sra

-rw-rw-r– 1 ubuntu ubuntu 2103892097 Apr 10 03:12 SRR869045_1.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 2198363062 Apr 10 03:12 SRR869045_2.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 2614023328 Apr 7 13:02 SRR869046.sra

-rw-rw-r– 1 ubuntu ubuntu 2054942375 Apr 10 03:13 SRR869046_1.fastq.gz

-rw-rw-r– 1 ubuntu ubuntu 2138446269 Apr 10 03:13 SRR869046_2.fastq.gz

3. Obtain, process and/or build genome, reference and index datasets

Download the genome file and index it

samtools faidx rn6.fa

rn6$ ls -l

-rw-rw-r– 1 ubuntu ubuntu 2927607333 Apr 9 19:26 rn6.fa

-rw-rw-r– 1 ubuntu ubuntu 40654 Apr 9 19:26 rn6.fa.fai

Download the refGene file and convert it to a GTF file

gunzip refGene.txt.gz

cut -f 2- refGene.txt > refGene.input

genePredToGtf file refGene.input refGene.gtf

genome_rat$ ls -l

-rw-rw-r– 1 ubuntu ubuntu 61891341 Apr 9 19:27 refGene.gtf

-rw-rw-r– 1 ubuntu ubuntu 5143380 Apr 9 19:27 refGene.input

-rw-rw-r– 1 ubuntu ubuntu 5226507 Apr 9 19:27 refGene.txt

4. Build a STAR index for the rat geneome

$ STAR --runThreadN 16 --runMode genomeGenerate --genomeDir StarIndexRat/ --genomeFastaFiles rn6/rn6.fa

Apr 09 18:39:04 ….. started STAR run

Apr 09 18:39:04 … starting to generate Genome files

Apr 09 18:40:18 … starting to sort Suffix Array. This may take a long time…

Apr 09 18:40:32 … sorting Suffix Array chunks and saving them to disk…

Apr 09 19:05:33 … loading chunks from disk, packing SA…

Apr 09 19:06:42 … finished generating suffix array

Apr 09 19:06:42 … generating Suffix Array index

Apr 09 19:10:57 … completed Suffix Array index

Apr 09 19:10:57 … writing Genome to disk …

Apr 09 19:10:59 … writing Suffix Array to disk …

Apr 09 19:12:19 … writing SAindex to disk

Apr 09 19:12:27 ….. finished successfully

StarIndexRat$ ls -l

-rw-rw-r– 1 ubuntu ubuntu 3095134208 Apr 9 19:10 Genome

-rw-rw-r– 1 ubuntu ubuntu 22521351645 Apr 9 19:12 SA

-rw-rw-r– 1 ubuntu ubuntu 1565873619 Apr 9 19:12 SAindex

-rw-rw-r– 1 ubuntu ubuntu 5213 Apr 9 18:40 chrLength.txt

-rw-rw-r– 1 ubuntu ubuntu 19347 Apr 9 18:40 chrName.txt

-rw-rw-r– 1 ubuntu ubuntu 24560 Apr 9 18:40 chrNameLength.txt

-rw-rw-r– 1 ubuntu ubuntu 10387 Apr 9 18:40 chrStart.txt

-rw-rw-r– 1 ubuntu ubuntu 479 Apr 9 19:10 genomeParameters.txt

5. Align the fastq.gz files to obtain BAM files

 ~/results/rnaseq/Rn/star_rat$ STAR 
 
 --runThreadN 12 
 
 --genomeDir StarIndexRat/ 
 
 --sjdbGTFfile ~/genome_rat/refGene.gtf 
 
 --sjdbOverhang 100 
 
 --readFilesIn ~/PLoS-One-8-e59582/f344_pfc_saline/SRR869044_1.fastq.gz
 
 ~/PLoS-One-8-e59582/f344_pfc_saline/SRR869044_2.fastq.gz 
 
 --readFilesCommand zcat 
 
 --quantMode TranscriptomeSAM 
 
 --outFileNamePrefix 1align/
 

Apr 10 03:30:30 ….. started STAR run

Apr 10 03:30:30 ….. loading genome

Apr 10 03:32:39 ….. processing annotations GTF

Apr 10 03:32:43 ….. inserting junctions into the genome indices

Apr 10 03:37:23 ….. started mapping

Apr 10 03:42:29 ….. finished successfully

$ ls -l 1align/

-rw-rw-r– 1 ubuntu ubuntu 15933444986 Apr 10 03:42 Aligned.out.sam

-rw-rw-r– 1 ubuntu ubuntu 2358643579 Apr 10 03:42 Aligned.toTranscriptome.out.bam

-rw-rw-r– 1 ubuntu ubuntu 1862 Apr 10 03:42 Log.final.out

-rw-rw-r– 1 ubuntu ubuntu 272935 Apr 10 03:42 Log.out

-rw-rw-r– 1 ubuntu ubuntu 836 Apr 10 03:42 Log.progress.out

-rw-rw-r– 1 ubuntu ubuntu 7368886 Apr 10 03:42 SJ.out.tab

drwx—— 2 ubuntu ubuntu 4096 Apr 10 03:32 _STARgenome

$ cat 1align/Log.final.out

                                 Started job on |   Apr 10 03:30:30
                             Started mapping on |   Apr 10 03:37:23
                                    Finished on |   Apr 10 03:42:29
       Mapping speed, Million of reads per hour |   489.23

                          Number of input reads |   41584891
                      Average input read length |   100
                                    UNIQUE READS:
                   Uniquely mapped reads number |   34796331
                        Uniquely mapped reads % |   83.68%
                          Average mapped length |   99.37
                       Number of splices: Total |   7910199
            Number of splices: Annotated (sjdb) |   7194940
                       Number of splices: GT/AG |   7764677
                       Number of splices: GC/AG |   62004
                       Number of splices: AT/AC |   7634
               Number of splices: Non-canonical |   75884
                      Mismatch rate per base, % |   0.37%
                         Deletion rate per base |   0.01%
                        Deletion average length |   1.61
                        Insertion rate per base |   0.00%
                       Insertion average length |   1.35
                             MULTI-MAPPING READS:
        Number of reads mapped to multiple loci |   2553852
             % of reads mapped to multiple loci |   6.14%
        Number of reads mapped to too many loci |   57308
             % of reads mapped to too many loci |   0.14%
                                  UNMAPPED READS:
       % of reads unmapped: too many mismatches |   0.00%
                 % of reads unmapped: too short |   9.92%
                     % of reads unmapped: other |   0.13%
                                  CHIMERIC READS:
                       Number of chimeric reads |   0
                            % of chimeric reads |   0.00%
~/results/rnaseq/Rn/star_rat/transcriptomeOut$ STAR --runThreadN 12 --genomeDir ~/genomeAndIndices/Rn/star/ --sjdbGTFfile ~/genomeAndIndices/Rn/rn6.refGene.gtf --sjdbOverhang 100 --readFilesIn ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_saline/SRR869045_1.fastq.gz ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_saline/SRR869045_2.fastq.gz --readFilesCommand zcat --quantMode TranscriptomeSAM --outFileNamePrefix 2align/

Apr 11 15:08:19 ….. started STAR run

Apr 11 15:08:20 ….. loading genome

Apr 11 15:12:01 ….. processing annotations GTF

Apr 11 15:12:25 ….. inserting junctions into the genome indices

Apr 11 15:37:46 ….. started mapping

Apr 11 15:58:54 ….. finished successfully

$ ls -l 2align/

-rw-rw-r– 1 ubuntu ubuntu 14869436644 Apr 11 15:58 Aligned.out.sam

-rw-rw-r– 1 ubuntu ubuntu 2216166668 Apr 11 15:58 Aligned.toTranscriptome.out.bam

-rw-rw-r– 1 ubuntu ubuntu 1863 Apr 11 15:58 Log.final.out

-rw-rw-r– 1 ubuntu ubuntu 290971 Apr 11 15:58 Log.out

-rw-rw-r– 1 ubuntu ubuntu 2488 Apr 11 15:58 Log.progress.out

-rw-rw-r– 1 ubuntu ubuntu 7278953 Apr 11 15:58 SJ.out.tab

drwx—— 2 ubuntu ubuntu 4096 Apr 11 15:12 _STARgenome

$ cat 2align/Log.final.out

                                 Started job on |   Apr 11 15:08:19
                             Started mapping on |   Apr 11 15:37:46
                                    Finished on |   Apr 11 15:58:54
       Mapping speed, Million of reads per hour |   116.02

                          Number of input reads |   40866035
                      Average input read length |   100
                                    UNIQUE READS:
                   Uniquely mapped reads number |   32594115
                        Uniquely mapped reads % |   79.76%
                          Average mapped length |   99.35
                       Number of splices: Total |   7372181
            Number of splices: Annotated (sjdb) |   6695155
                       Number of splices: GT/AG |   7235135
                       Number of splices: GC/AG |   58523
                       Number of splices: AT/AC |   6995
               Number of splices: Non-canonical |   71528
                      Mismatch rate per base, % |   0.38%
                         Deletion rate per base |   0.01%
                        Deletion average length |   1.61
                        Insertion rate per base |   0.01%
                       Insertion average length |   1.35
                             MULTI-MAPPING READS:
        Number of reads mapped to multiple loci |   2353903
             % of reads mapped to multiple loci |   5.76%
        Number of reads mapped to too many loci |   52876
             % of reads mapped to too many loci |   0.13%
                                  UNMAPPED READS:
       % of reads unmapped: too many mismatches |   0.00%
                 % of reads unmapped: too short |   14.23%
                     % of reads unmapped: other |   0.12%
                                  CHIMERIC READS:
                       Number of chimeric reads |   0
                            % of chimeric reads |   0.00%

~/results/rnaseq/Rn/star_rat/transcriptomeOut$ STAR --runThreadN 12 --genomeDir ~/genomeAndIndices/Rn/star/ --sjdbGTFfile ~/genomeAndIndices/Rn/rn6.refGene.gtf --sjdbOverhang 100 --readFilesIn ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_saline/SRR869046_1.fastq.gz ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_saline/SRR869046_2.fastq.gz --readFilesCommand zcat --quantMode TranscriptomeSAM --outFileNamePrefix 3align/

Apr 11 16:00:52 ….. started STAR run

Apr 11 16:00:52 ….. loading genome

Apr 11 16:02:35 ….. processing annotations GTF

Apr 11 16:02:37 ….. inserting junctions into the genome indices

Apr 11 16:05:23 ….. started mapping

Apr 11 16:11:29 ….. finished successfully

$ ls -l 3align/

-rw-rw-r– 1 ubuntu ubuntu 14998319245 Apr 11 16:11 Aligned.out.sam

-rw-rw-r– 1 ubuntu ubuntu 2183814631 Apr 11 16:11 Aligned.toTranscriptome.out.bam

-rw-rw-r– 1 ubuntu ubuntu 1863 Apr 11 16:11 Log.final.out

-rw-rw-r– 1 ubuntu ubuntu 290970 Apr 11 16:11 Log.out

-rw-rw-r– 1 ubuntu ubuntu 954 Apr 11 16:11 Log.progress.out

-rw-rw-r– 1 ubuntu ubuntu 7220923 Apr 11 16:11 SJ.out.tab

drwx—— 2 ubuntu ubuntu 4096 Apr 11 16:02 _STARgenome

$ cat 3align/Log.final.out

                                 Started job on |   Apr 11 16:00:52
                             Started mapping on |   Apr 11 16:05:23
                                    Finished on |   Apr 11 16:11:29
       Mapping speed, Million of reads per hour |   387.26

                          Number of input reads |   39370935
                      Average input read length |   100
                                    UNIQUE READS:
                   Uniquely mapped reads number |   32717958
                        Uniquely mapped reads % |   83.10%
                          Average mapped length |   99.35
                       Number of splices: Total |   7102328
            Number of splices: Annotated (sjdb) |   6458206
                       Number of splices: GT/AG |   6971391
                       Number of splices: GC/AG |   55634
                       Number of splices: AT/AC |   6999
               Number of splices: Non-canonical |   68304
                      Mismatch rate per base, % |   0.40%
                         Deletion rate per base |   0.01%
                        Deletion average length |   1.61
                        Insertion rate per base |   0.01%
                       Insertion average length |   1.35
                             MULTI-MAPPING READS:
        Number of reads mapped to multiple loci |   2462309
             % of reads mapped to multiple loci |   6.25%
        Number of reads mapped to too many loci |   51917
             % of reads mapped to too many loci |   0.13%
                                  UNMAPPED READS:
       % of reads unmapped: too many mismatches |   0.00%
                 % of reads unmapped: too short |   10.38%
                     % of reads unmapped: other |   0.13%
                                  CHIMERIC READS:
                       Number of chimeric reads |   0
                            % of chimeric reads |   0.00%
~/results/rnaseq/Rn/star_rat/transcriptomeOut$ STAR --runThreadN 12 --genomeDir ~/genomeAndIndices/Rn/star/ --sjdbGTFfile ~/genomeAndIndices/Rn/rn6.refGene.gtf --sjdbOverhang 100 --readFilesIn ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_nicotine/SRR869032_1.fastq.gz ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_nicotine/SRR869032_2.fastq.gz --readFilesCommand zcat --quantMode TranscriptomeSAM --outFileNamePrefix 4align/

Apr 11 16:21:26 ….. started STAR run

Apr 11 16:21:26 ….. loading genome

Apr 11 16:23:09 ….. processing annotations GTF

Apr 11 16:23:10 ….. inserting junctions into the genome indices

Apr 11 16:25:24 ….. started mapping

Apr 11 16:28:58 ….. finished successfully

$ ls -l 4align/

-rw-rw-r– 1 ubuntu ubuntu 10933116395 Apr 11 16:28 Aligned.out.sam

-rw-rw-r– 1 ubuntu ubuntu 1617775311 Apr 11 16:28 Aligned.toTranscriptome.out.bam

-rw-rw-r– 1 ubuntu ubuntu 1863 Apr 11 16:28 Log.final.out

-rw-rw-r– 1 ubuntu ubuntu 291006 Apr 11 16:28 Log.out

-rw-rw-r– 1 ubuntu ubuntu 600 Apr 11 16:28 Log.progress.out

-rw-rw-r– 1 ubuntu ubuntu 6778075 Apr 11 16:28 SJ.out.tab

drwx—— 2 ubuntu ubuntu 4096 Apr 11 16:23 _STARgenome

$ cat 4align/Log.final.out

                                 Started job on |   Apr 11 16:21:26
                             Started mapping on |   Apr 11 16:25:24
                                    Finished on |   Apr 11 16:28:58
       Mapping speed, Million of reads per hour |   486.66

                          Number of input reads |   28929485
                      Average input read length |   100
                                    UNIQUE READS:
                   Uniquely mapped reads number |   23884850
                        Uniquely mapped reads % |   82.56%
                          Average mapped length |   99.37
                       Number of splices: Total |   5337591
            Number of splices: Annotated (sjdb) |   4843698
                       Number of splices: GT/AG |   5237284
                       Number of splices: GC/AG |   42360
                       Number of splices: AT/AC |   5126
               Number of splices: Non-canonical |   52821
                      Mismatch rate per base, % |   0.38%
                         Deletion rate per base |   0.01%
                        Deletion average length |   1.61
                        Insertion rate per base |   0.01%
                       Insertion average length |   1.35
                             MULTI-MAPPING READS:
        Number of reads mapped to multiple loci |   1745210
             % of reads mapped to multiple loci |   6.03%
        Number of reads mapped to too many loci |   41759
             % of reads mapped to too many loci |   0.14%
                                  UNMAPPED READS:
       % of reads unmapped: too many mismatches |   0.00%
                 % of reads unmapped: too short |   11.13%
                     % of reads unmapped: other |   0.14%
                                  CHIMERIC READS:
                       Number of chimeric reads |   0
                            % of chimeric reads |   0.00%
~/results/rnaseq/Rn/star_rat/transcriptomeOut$ STAR --runThreadN 12 --genomeDir ~/genomeAndIndices/Rn/star/ --sjdbGTFfile ~/genomeAndIndices/Rn/rn6.refGene.gtf --sjdbOverhang 100 --readFilesIn ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_nicotine/SRR869033_1.fastq.gz ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_nicotine/SRR869033_2.fastq.gz --readFilesCommand zcat --quantMode TranscriptomeSAM --outFileNamePrefix 5align/

Apr 11 16:32:44 ….. started STAR run

Apr 11 16:32:44 ….. loading genome

Apr 11 16:34:26 ….. processing annotations GTF

Apr 11 16:34:28 ….. inserting junctions into the genome indices

Apr 11 16:36:40 ….. started mapping

Apr 11 16:40:24 ….. finished successfully

$ ls -l 5align/

-rw-rw-r– 1 ubuntu ubuntu 11152871716 Apr 11 16:40 Aligned.out.sam

-rw-rw-r– 1 ubuntu ubuntu 1650315098 Apr 11 16:40 Aligned.toTranscriptome.out.bam

-rw-rw-r– 1 ubuntu ubuntu 1863 Apr 11 16:40 Log.final.out

-rw-rw-r– 1 ubuntu ubuntu 291006 Apr 11 16:40 Log.out

-rw-rw-r– 1 ubuntu ubuntu 600 Apr 11 16:40 Log.progress.out

-rw-rw-r– 1 ubuntu ubuntu 6943028 Apr 11 16:40 SJ.out.tab

drwx—— 2 ubuntu ubuntu 4096 Apr 11 16:34 _STARgenome

$ cat 5align/Log.final.out

                                 Started job on |   Apr 11 16:32:44
                             Started mapping on |   Apr 11 16:36:40
                                    Finished on |   Apr 11 16:40:24
       Mapping speed, Million of reads per hour |   483.07

                          Number of input reads |   30057458
                      Average input read length |   100
                                    UNIQUE READS:
                   Uniquely mapped reads number |   24242026
                        Uniquely mapped reads % |   80.65%
                          Average mapped length |   99.39
                       Number of splices: Total |   5464310
            Number of splices: Annotated (sjdb) |   4969845
                       Number of splices: GT/AG |   5365023
                       Number of splices: GC/AG |   42481
                       Number of splices: AT/AC |   5178
               Number of splices: Non-canonical |   51628
                      Mismatch rate per base, % |   0.37%
                         Deletion rate per base |   0.01%
                        Deletion average length |   1.60
                        Insertion rate per base |   0.00%
                       Insertion average length |   1.36
                             MULTI-MAPPING READS:
        Number of reads mapped to multiple loci |   1816245
             % of reads mapped to multiple loci |   6.04%
        Number of reads mapped to too many loci |   44886
             % of reads mapped to too many loci |   0.15%
                                  UNMAPPED READS:
       % of reads unmapped: too many mismatches |   0.00%
                 % of reads unmapped: too short |   13.03%
                     % of reads unmapped: other |   0.13%
                                  CHIMERIC READS:
                       Number of chimeric reads |   0
                            % of chimeric reads |   0.00%

~/results/rnaseq/Rn/star_rat/transcriptomeOut$ STAR --runThreadN 12 --genomeDir ~/genomeAndIndices/Rn/star/ --sjdbGTFfile ~/genomeAndIndices/Rn/rn6.refGene.gtf --sjdbOverhang 100 --readFilesIn ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_nicotine/SRR869034_1.fastq.gz ~/data/rnaseq/Rn/PLoS-One-8-e59582/f344_pfc_nicotine/SRR869034_2.fastq.gz --readFilesCommand zcat --quantMode TranscriptomeSAM --outFileNamePrefix 6align/

Apr 11 16:41:46 ….. started STAR run

Apr 11 16:41:46 ….. loading genome

Apr 11 16:42:54 ….. processing annotations GTF

Apr 11 16:42:55 ….. inserting junctions into the genome indices

Apr 11 16:45:08 ….. started mapping

Apr 11 16:48:49 ….. finished successfully

$ ls -l 6align/

-rw-rw-r– 1 ubuntu ubuntu 11451915825 Apr 11 16:48 Aligned.out.sam

-rw-rw-r– 1 ubuntu ubuntu 1719135420 Apr 11 16:48 Aligned.toTranscriptome.out.bam

-rw-rw-r– 1 ubuntu ubuntu 1862 Apr 11 16:48 Log.final.out

-rw-rw-r– 1 ubuntu ubuntu 291006 Apr 11 16:48 Log.out

-rw-rw-r– 1 ubuntu ubuntu 600 Apr 11 16:48 Log.progress.out

-rw-rw-r– 1 ubuntu ubuntu 6840437 Apr 11 16:48 SJ.out.tab

drwx—— 2 ubuntu ubuntu 4096 Apr 11 16:42 _STARgenome

$ cat 6align/Log.final.out

                                 Started job on |   Apr 11 16:41:46
                             Started mapping on |   Apr 11 16:45:08
                                    Finished on |   Apr 11 16:48:49
       Mapping speed, Million of reads per hour |   485.67

                          Number of input reads |   29814687
                      Average input read length |   100
                                    UNIQUE READS:
                   Uniquely mapped reads number |   25029582
                        Uniquely mapped reads % |   83.95%
                          Average mapped length |   99.40
                       Number of splices: Total |   5664801
            Number of splices: Annotated (sjdb) |   5152217
                       Number of splices: GT/AG |   5560246
                       Number of splices: GC/AG |   44589
                       Number of splices: AT/AC |   5504
               Number of splices: Non-canonical |   54462
                      Mismatch rate per base, % |   0.38%
                         Deletion rate per base |   0.01%
                        Deletion average length |   1.61
                        Insertion rate per base |   0.00%
                       Insertion average length |   1.36
                             MULTI-MAPPING READS:
        Number of reads mapped to multiple loci |   1834753
             % of reads mapped to multiple loci |   6.15%
        Number of reads mapped to too many loci |   40924
             % of reads mapped to too many loci |   0.14%
                                  UNMAPPED READS:
       % of reads unmapped: too many mismatches |   0.00%
                 % of reads unmapped: too short |   9.63%
                     % of reads unmapped: other |   0.13%
                                  CHIMERIC READS:
                       Number of chimeric reads |   0
                            % of chimeric reads |   0.00%

6. RSEM analysis

Download the data

BAM files were imported to CentOS as directories (1s, 2s, 3s, 4s, 5s and 6s) for RSEM analysis. The genome and GTF files are were also imported (& also renamed).

$ ls -l

drwxr-xr-x. 2 bdash bdash 45 Apr 11 20:17 1s

drwxr-xr-x. 2 bdash bdash 45 Apr 11 18:21 2s

drwxr-xr-x. 2 bdash bdash 45 Apr 11 20:20 3s

drwxr-xr-x. 2 bdash bdash 45 Apr 11 20:21 4s

drwxr-xr-x. 2 bdash bdash 45 Apr 11 20:27 5s

drwxr-xr-x. 2 bdash bdash 45 Apr 11 20:27 6s

-rw-rw-r–. 1 bdash bdash 2927607333 Apr 9 15:26 rn6.fa

-rw-rw-r–. 1 bdash bdash 40654 Apr 9 15:26 rn6.fa.fai

-rw-rw-r–. 1 bdash bdash 61891341 Apr 9 15:27 rn6.refGene.gtf

Prepare RSEM reference (will use both the fa and gtf file)

mkdir rsem_ref

cd rsem_ref

rsem_ref$ rsem-prepare-reference –gtf rn6.refGene.gtf rn6.fa ./rsemRef


rsem-extract-reference-transcripts ./rsemRef 0 rn6.refGene.gtf None 0 rn6.fa

Parsed 200000 lines

Parsing gtf File is done!

rn6.fa is processed!

18939 transcripts are extracted and 0 transcripts are omitted.

Extracting sequences is done!

Group File is generated!

Transcript Information File is generated!

Chromosome List File is generated!

Extracted Sequences File is generated!

rsem-preref ./rsemRef.transcripts.fa 1 ./rsemRef

Refs.makeRefs finished!

Refs.saveRefs finished!

./rsemRef.idx.fa is generated!

./rsemRef.n2g.idx.fa is generated!

star-transcriptomeout$ ls -l rsem_ref/

-rw-rw-r–. 1 bdash bdash 1293 Apr 11 21:06 rsemRef.chrlist

-rw-rw-r–. 1 bdash bdash 93718 Apr 11 21:06 rsemRef.grp

-rw-rw-r–. 1 bdash bdash 43007289 Apr 11 21:06 rsemRef.idx.fa

-rw-rw-r–. 1 bdash bdash 43007289 Apr 11 21:06 rsemRef.n2g.idx.fa

-rw-rw-r–. 1 bdash bdash 45858412 Apr 11 21:06 rsemRef.seq

-rw-rw-r–. 1 bdash bdash 6041108 Apr 11 21:06 rsemRef.ti

-rw-rw-r–. 1 bdash bdash 43007289 Apr 11 21:06 rsemRef.transcripts.fa

RSEM-calculate-expression

star-transcriptomeout$ rsem-calculate-expression –bam –no-bam-output -p 12 –paired-end –forward-prob 0 1s/Aligned.toTranscriptome.out.bam rsem_ref/rsemRef 1out/ >& rsem1.log

Repeat it for the rest of the bam files

star-transcriptomeout$ ls -l

drwxrwxr-x. 3 bdash bdash 66 Apr 11 22:41 1out

drwxrwxr-x. 3 bdash bdash 66 Apr 11 23:56 2out

drwxrwxr-x. 3 bdash bdash 66 Apr 12 03:48 3out

drwxrwxr-x. 3 bdash bdash 66 Apr 12 03:13 4out

drwxrwxr-x. 3 bdash bdash 66 Apr 12 02:48 5out

drwxrwxr-x. 3 bdash bdash 66 Apr 12 01:54 6out

-rw-rw-r–. 1 bdash bdash 309141 Apr 11 22:41 rsem1.log

-rw-rw-r–. 1 bdash bdash 353855 Apr 11 23:56 rsem2.log

-rw-rw-r–. 1 bdash bdash 255588 Apr 12 03:48 rsem3.log

-rw-rw-r–. 1 bdash bdash 326662 Apr 12 03:13 rsem4.log

-rw-rw-r–. 1 bdash bdash 366472 Apr 12 02:48 rsem5.log

-rw-rw-r–. 1 bdash bdash 294402 Apr 12 01:54 rsem6.log

drwxrwxr-x. 2 bdash bdash 163 Apr 11 21:20 rsem_ref

7. edgeR (Empirical Analysis of Digital Gene Expression) analysis of isoforms

Generate a matrix file of the isoforms for analysis using edgeR method

star-transcriptomeout$ abundance_estimates_to_matrix.pl 

--est_method RSEM 


1out/.isoforms.results 
2out/.isoforms.results 
3out/.isoforms.results 
4out/.isoforms.results 
5out/.isoforms.results 
6out/.isoforms.results 

--gene_trans_map none 

--name_sample_by_basedir 

--out_prefix isoforms_gene_trans_map_none/isoforms

-reading file: 1out/.isoforms.results

-reading file: 2out/.isoforms.results

-reading file: 3out/.isoforms.results

-reading file: 4out/.isoforms.results

-reading file: 5out/.isoforms.results

-reading file: 6out/.isoforms.results

  • Outputting combined matrix.

/home/bdash/miniconda2/opt/trinity-2.6.6/util/support_scripts/run_TMM_scale_matrix.pl

–matrix isoforms_gene_trans_map_none/isoforms.isoform.TPM.not_cross_norm >

isoforms_gene_trans_map_none/isoforms.isoform.TMM.EXPR.matrix

CMD: R –no-save –no-restore –no-site-file –no-init-file -q <

isoforms_gene_trans_map_none/isoforms.isoform.TPM.not_cross_norm.runTMM.R 1>&2

> library(edgeR)

Loading required package: limma

> 

> rnaseqMatrix = read.table("isoforms_gene_trans_map_none/isoforms.isoform.TPM.not_cross_norm", header=T, row.names=1, com='', check.names=F)

> rnaseqMatrix = as.matrix(rnaseqMatrix)

> rnaseqMatrix = round(rnaseqMatrix)

> exp_study = DGEList(counts=rnaseqMatrix, group=factor(colnames(rnaseqMatrix)))

> exp_study = calcNormFactors(exp_study)

> exp_study$samples$eff.lib.size = exp_study$samples$lib.size * exp_study$samples$norm.factors

> write.table(exp_study$samples, file="isoforms_gene_trans_map_none/isoforms.isoform.TPM.not_cross_norm.TMM_info.txt", quote=F, sep="\t", row.names=F)

star-transcriptomeout$ ls -l isoforms_gene_trans_map_none/

-rw-rw-r–. 1 bdash bdash 934917 Apr 12 12:12 isoforms.isoform.counts.matrix

-rw-rw-r–. 1 bdash bdash 981854 Apr 12 12:12 isoforms.isoform.TMM.EXPR.matrix

-rw-rw-r–. 1 bdash bdash 775288 Apr 12 12:12 isoforms.isoform.TPM.not_cross_norm

-rw-rw-r–. 1 bdash bdash 590 Apr 12 12:12 isoforms.isoform.TPM.not_cross_norm.runTMM.R

-rw-rw-r–. 1 bdash bdash 320 Apr 12 12:12 isoforms.isoform.TPM.not_cross_norm.TMM_info.txt

Run differential analysis (DE) analysis using method edgeR: Produces MA plot and volcano plot

Note: Analysis with biological triplicates with two conditions (condition A=saline treatment and condition B=nicotine treatment)

A file with the name “samples_described.txt” will be needed for the analysis. Its contents are as follows:

$ cat samples_described.txt 

conditionA   1out
conditionA   2out
conditionA   3out


conditionB   4out
conditionB   5out
conditionB   6out
star-transcriptomeout]$ run_DE_analysis.pl 

--matrix isoforms_gene_trans_map_none/isoforms.isoform.counts.matrix 

--output isoforms_DE_3/ 

--samples_file samples_described.txt 

--method edgeR

Got 6 samples, and got: 7 data fields.

Header: 1out 2out 3out 4out 5out 6out

Next: NM_021666 13.00 7.00 6.00 1.00 2.00 4.00

$VAR1 =

    {

      '2out' => 2,
      
      '1out' => 1,
      
      '4out' => 4,
      
      '5out' => 5,
      
      '3out' => 3,
      
      '6out' => 6
      
    };
    

$VAR1 =

    {
      
      'conditionB' => [
      
                        '4out',
                        
                        '5out',
                        
                        '6out'
                        
                      ],
                      
                      
      'conditionA' => [
      
                        '1out',
                        
                        '2out',
                        
                        '3out'
                        
                      ]
    };
    

Contrasts to perform are: $VAR1 =

    [

      [
      
        'conditionA',
        
        'conditionB'
        
      ]
      
    ];
    

CMD: R –no-save –no-restore –no-site-file –no-init-file -q < isoforms.isoform.counts.matrix.conditionA_vs_conditionB.conditionA.vs.conditionB.EdgeR.Rscript

> library(edgeR)

Loading required package: limma

> 
> data = read.table("/home/bdash/Desktop/star-transcriptomeout/isoforms_gene_trans_map_none/isoforms.isoform.counts.matrix", header=T, row.names=1, com='')

> col_ordering = c(1,2,3,4,5,6)

> rnaseqMatrix = data[,col_ordering]

> rnaseqMatrix = round(rnaseqMatrix)

> rnaseqMatrix = rnaseqMatrix[rowSums(cpm(rnaseqMatrix) > 1) >= 2,]

> conditions = factor(c(rep("conditionA", 3), rep("conditionB", 3)))
> 
> exp_study = DGEList(counts=rnaseqMatrix, group=conditions)

> exp_study = calcNormFactors(exp_study)

> exp_study = estimateCommonDisp(exp_study)

> exp_study = estimateTagwiseDisp(exp_study)

> et = exactTest(exp_study, pair=c("conditionA", "conditionB"))

> tTags = topTags(et,n=NULL)

> result_table = tTags$table

> result_table = data.frame(sampleA="conditionA", sampleB="conditionB", result_table)

> result_table$logFC = -1 * result_table$logFC

> write.table(result_table, file='isoforms.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.DE_results', sep='  ', quote=F, row.names=T)

> write.table(rnaseqMatrix, file='isoforms.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.count_matrix', sep='    ', quote=F, row.names=T)

> source("/home/bdash/miniconda2/opt/trinity-2.6.6/Analysis/DifferentialExpression/R/rnaseq_plot_funcs.R")

> pdf("isoforms.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.DE_results.MA_n_Volcano.pdf")

> plot_MA_and_Volcano(rownames(result_table), result_table$logCPM, result_table$logFC, result_table$FDR)

> dev.off()

null device 
          1 
          
> 

star-transcriptomeout]$ ls -l isoforms_DE_3/

-rw-rw-r–. 1 bdash bdash 1425 Apr 13 02:26 isoforms.isoform.counts.matrix.conditionA_vs_conditionB.conditionA.vs.conditionB.EdgeR.Rscript

-rw-rw-r–. 1 bdash bdash 447974 Apr 13 02:27 isoforms.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.count_matrix

-rw-rw-r–. 1 bdash bdash 1156287 Apr 13 02:27 isoforms.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.DE_results

-rw-rw-r–. 1 bdash bdash 118065 Apr 13 02:27 isoforms.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.DE_results.MA_n_Volcano.pdf

-rw-rw-r–. 1 bdash bdash 959 Apr 13 02:29 isoforms.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.DE_results.P0.001_C2.conditionA-UP.subset

-rw-rw-r–. 1 bdash bdash 513 Apr 13 02:29 isoforms.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.DE_results.P0.001_C2.conditionB-UP.subset

-rw-rw-r–. 1 bdash bdash 1402 Apr 13 02:29 isoforms.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.DE_results.P0.001_C2.DE.subset

-rw-rw-r–. 1 bdash bdash 96 Apr 13 02:29 isoforms.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.DE_results.samples

DE_isoforms.MA_plot

DE_isoforms.MA_plot

DE_isoforms.volcano_plot

DE_isoforms.volcano_plot

star-transcriptomeout$ cd isoforms_DE_3/

Analyze differential expression: Produces heatmap

isoforms_DE_3$ analyze_diff_expr.pl 

--matrix ../isoforms_gene_trans_map_none/isoforms.isoform.TMM.EXPR.matrix 

--samples ../samples_described.txt 

--output DE_isoforms_3

Found 9 features as differentially expressed.

CMD:

/home/bdash/miniconda2/opt/trinity-2.6.6/Analysis/DifferentialExpression/PtR

-m DE_isoforms_3.matrix

–log2

–heatmap

–min_colSums 0

–min_rowSums 0

–gene_dist euclidean

–sample_dist euclidean

–sample_cor_matrix

–center_rows

–save

-s ../samples_described.txt

CMD:

R

–no-save

–no-restore

–no-site-file

–no-init-file

-q < DE_isoforms_3.matrix.R

> library(cluster)

> library(Biobase)

Loading required package: BiocGenerics

Loading required package: parallel

Attaching package: ‘BiocGenerics’

The following objects are masked from ‘package:parallel’:

clusterApply, clusterApplyLB, clusterCall, clusterEvalQ,
clusterExport, clusterMap, parApply, parCapply, parLapply,
parLapplyLB, parRapply, parSapply, parSapplyLB

The following objects are masked from ‘package:stats’:

IQR, mad, sd, var, xtabs

The following objects are masked from ‘package:base’:

anyDuplicated, append, as.data.frame, basename, cbind, colMeans,
colnames, colSums, dirname, do.call, duplicated, eval, evalq,
Filter, Find, get, grep, grepl, intersect, is.unsorted, lapply,
lengths, Map, mapply, match, mget, order, paste, pmax, pmax.int,
pmin, pmin.int, Position, rank, rbind, Reduce, rowMeans, rownames,
rowSums, sapply, setdiff, sort, table, tapply, union, unique,
unsplit, which, which.max, which.min

Welcome to Bioconductor

Vignettes contain introductory material; view with
'browseVignettes()'. To cite Bioconductor, see
'citation("Biobase")', and for packages 'citation("pkgname")'.
> library(qvalue)

> library(fastcluster)

Attaching package: ‘fastcluster’

The following object is masked from ‘package:stats’:

hclust
> options(stringsAsFactors = FALSE)

> NO_REUSE = F

> 

> # try to reuse earlier-loaded data if possible

> if (file.exists("DE_isoforms_3.matrix.RData") && ! NO_REUSE) {
+     print('RESTORING DATA FROM EARLIER ANALYSIS')
+     load("DE_isoforms_3.matrix.RData")
+ } else {
+     print('Reading matrix file.')
+     primary_data = read.table("DE_isoforms_3.matrix", header=T, com='', row.names=1, check.names=F)
+     primary_data = as.matrix(primary_data)
+ }

[1] "Reading matrix file."

> source("/home/bdash/miniconda2/opt/trinity-2.6.6/Analysis/DifferentialExpression/R/heatmap.3.R")

> source("/home/bdash/miniconda2/opt/trinity-2.6.6/Analysis/DifferentialExpression/R/misc_rnaseq_funcs.R")

> source("/home/bdash/miniconda2/opt/trinity-2.6.6/Analysis/DifferentialExpression/R/pairs3.R")

> source("/home/bdash/miniconda2/opt/trinity-2.6.6/Analysis/DifferentialExpression/R/vioplot2.R")

> data = primary_data

> myheatcol = colorpanel(75, 'purple','black','yellow')

> samples_data = read.table("../samples_described.txt", header=F, check.names=F, fill=T)

> samples_data = samples_data[samples_data[,2] != '',]

> colnames(samples_data) = c('sample_name', 'replicate_name')

> sample_types = as.character(unique(samples_data[,1]))

> rep_names = as.character(samples_data[,2])

> data = data[, colnames(data) %in% rep_names, drop=F ]

> nsamples = length(sample_types)

> sample_colors = rainbow(nsamples)

> names(sample_colors) = sample_types

> sample_type_list = list()

> for (i in 1:nsamples) {
+     samples_want = samples_data[samples_data[,1]==sample_types[i], 2]
+     sample_type_list[[sample_types[i]]] = as.vector(samples_want)
+ }

> sample_factoring = colnames(data)

> for (i in 1:nsamples) {
+     sample_type = sample_types[i]
+     replicates_want = sample_type_list[[sample_type]]
+     sample_factoring[ colnames(data) %in% replicates_want ] = sample_type
+ }

> initial_matrix = data # store before doing various data transformations

> data = log2(data+1)

> sample_factoring = colnames(data)

> for (i in 1:nsamples) {
+     sample_type = sample_types[i]
+     replicates_want = sample_type_list[[sample_type]]
+     sample_factoring[ colnames(data) %in% replicates_want ] = sample_type
+ }

> sampleAnnotations = matrix(ncol=ncol(data),nrow=nsamples)

> for (i in 1:nsamples) {
+   sampleAnnotations[i,] = colnames(data) %in% sample_type_list[[sample_types[i]]]
+ }

> sampleAnnotations = apply(sampleAnnotations, 1:2, function(x) as.logical(x))

> sampleAnnotations = sample_matrix_to_color_assignments(sampleAnnotations, col=sample_colors)

> rownames(sampleAnnotations) = as.vector(sample_types)

> colnames(sampleAnnotations) = colnames(data)

> data = as.matrix(data) # convert to matrix

> 
> # Centering rows

> data = t(scale(t(data), scale=F))
> 

> write.table(data, file="DE_isoforms_3.matrix.log2.centered.dat", quote=F, sep='   ');

> if (nrow(data) < 2) { stop("
+ 
+ **** Sorry, at least two rows are required for this matrix.
+ 
+ ");}


> if (ncol(data) < 2) { stop("
+ 
+ **** Sorry, at least two columns are required for this matrix.
+ 
+ ");}

> sample_cor = cor(data, method='pearson', use='pairwise.complete.obs')

> write.table(sample_cor, file="DE_isoforms_3.matrix.log2.centered.sample_cor.dat", quote=F, sep='  ')

> sample_dist = dist(t(data), method='euclidean')

> hc_samples = hclust(sample_dist, method='complete')

> pdf("DE_isoforms_3.matrix.log2.centered.sample_cor_matrix.pdf")

> sample_cor_for_plot = sample_cor

> heatmap.3(sample_cor_for_plot, dendrogram='both', Rowv=as.dendrogram(hc_samples), Colv=as.dendrogram(hc_samples), col = myheatcol, scale='none', symm=TRUE, key=TRUE,density.info='none', trace='none', symkey=FALSE, symbreaks=F, margins=c(10,10), cexCol=1, cexRow=1, cex.main=0.75, main=paste("sample correlation matrix
+ ", "DE_isoforms_3.matrix.log2.centered") , ColSideColors=sampleAnnotations, RowSideColors=t(sampleAnnotations))
for plotting:: min.raw: -0.959807727628706 max.raw: 1

> dev.off()

null device 
          1 
          
> gene_cor = NULL

> gene_dist = dist(data, method='euclidean')

> if (nrow(data) <= 1) { message('Too few genes to generate heatmap'); quit(status=0); }

> hc_genes = hclust(gene_dist, method='complete')

> heatmap_data = data

> pdf("DE_isoforms_3.matrix.log2.centered.genes_vs_samples_heatmap.pdf")

> heatmap.3(heatmap_data, dendrogram='both', Rowv=as.dendrogram(hc_genes), Colv=as.dendrogram(hc_samples), col=myheatcol, scale="none", density.info="none", trace="none", key=TRUE, keysize=1.2, cexCol=1, margins=c(10,10), cex.main=0.75, main=paste("samples vs. features
+ ", "DE_isoforms_3.matrix.log2.centered" ) , ColSideColors=sampleAnnotations)
for plotting:: min.raw: -5.1576065841341 max.raw: 5.1576065841341

> dev.off()

null device 
          1 
> save(list=ls(all=TRUE), file="DE_isoforms_3.matrix.RData")

> 

star-transcriptomeout]$ ls -l isoforms_DE_3/

-rw-rw-r–. 1 bdash bdash 53 Apr 13 02:29 DE_feature_counts.P0.001_C2.matrix

-rw-rw-r–. 1 bdash bdash 476 Apr 13 02:29 DE_isoforms_3.matrix

-rw-rw-r–. 1 bdash bdash 1104 Apr 13 02:29 DE_isoforms_3.matrix.log2.centered.dat

-rw-rw-r–. 1 bdash bdash 6526 Apr 13 02:29 DE_isoforms_3.matrix.log2.centered.genes_vs_samples_heatmap.pdf

-rw-rw-r–. 1 bdash bdash 634 Apr 13 02:29 DE_isoforms_3.matrix.log2.centered.sample_cor.dat

-rw-rw-r–. 1 bdash bdash 6381 Apr 13 02:29 DE_isoforms_3.matrix.log2.centered.sample_cor_matrix.pdf

-rw-rw-r–. 1 bdash bdash 4465 Apr 13 02:29 DE_isoforms_3.matrix.R

-rw-rw-r–. 1 bdash bdash 34409 Apr 13 02:29 DE_isoforms_3.matrix.RData

library(pdftools)
pdf_convert('isoforms_DE_3/DE_isoforms_3.matrix.log2.centered.genes_vs_samples_heatmap.pdf', format = "jpeg", pages = NULL, filenames = NULL, dpi = 300, antialias = TRUE, opw = "", upw = "", verbose = TRUE)
Converting page 1 to DE_isoforms_3.matrix.log2.centered.genes_vs_samples_heatmap_1.jpeg... done!
[1] "DE_isoforms_3.matrix.log2.centered.genes_vs_samples_heatmap_1.jpeg"
genes_vs_sample_heatmap

genes_vs_sample_heatmap

pdf_convert('isoforms_DE_3/DE_isoforms_3.matrix.log2.centered.sample_cor_matrix.pdf', format = "jpeg", pages = NULL, filenames = NULL, dpi = 300, antialias = TRUE, opw = "", upw = "", verbose = TRUE)
Converting page 1 to DE_isoforms_3.matrix.log2.centered.sample_cor_matrix_1.jpeg... done!
[1] "DE_isoforms_3.matrix.log2.centered.sample_cor_matrix_1.jpeg"
sample_cor_matrix

sample_cor_matrix

8. edgeR analysis of differentail gene expression (similar to the isoforms analysis done above)

Generate a matrix file of abundance estimates


star-transcriptomeout$ abundance_estimates_to_matrix.pl 

--est_method RSEM 

1out/.genes.results 
2out/.genes.results 
3out/.genes.results 
4out/.genes.results 
5out/.genes.results 
6out/.genes.results 

--gene_trans_map none 

--name_sample_by_basedir 

--out_prefix genes_gene_trans_map_none/genes

-reading file: 1out/.genes.results

-reading file: 2out/.genes.results

-reading file: 3out/.genes.results

-reading file: 4out/.genes.results

-reading file: 5out/.genes.results

-reading file: 6out/.genes.results

  • Outputting combined matrix.

/home/bdash/miniconda2/opt/trinity-2.6.6/util/support_scripts/run_TMM_scale_matrix.pl –matrix genes_gene_trans_map_none/genes.isoform.TPM.not_cross_norm > genes_gene_trans_map_none/genes.isoform.TMM.EXPR.matrixCMD: R –no-save –no-restore –no-site-file –no-init-file -q < genes_gene_trans_map_none/genes.isoform.TPM.not_cross_norm.runTMM.R 1>&2

…………….

star-transcriptomeout$ ls -l genes_gene_trans_map_none/

-rw-rw-r–. 1 bdash bdash 764847 Apr 12 12:24 genes.isoform.counts.matrix

-rw-rw-r–. 1 bdash bdash 805903 Apr 12 12:24 genes.isoform.TMM.EXPR.matrix

-rw-rw-r–. 1 bdash bdash 622537 Apr 12 12:24 genes.isoform.TPM.not_cross_norm

-rw-rw-r–. 1 bdash bdash 578 Apr 12 12:24 genes.isoform.TPM.not_cross_norm.runTMM.R

-rw-rw-r–. 1 bdash bdash 318 Apr 12 12:24 genes.isoform.TPM.not_cross_norm.TMM_info.txt

DE analysis of gene expression: Priduces MA plot, volcano plot and counts matrix

Note biologiacl triplicates for each group (see below)

star-transcriptomeout$ run_DE_analysis.pl 

--matrix genes_gene_trans_map_none/genes.isoform.counts.matrix 

--output genes_DE_3/ 

--samples_file samples_described.txt 

--method edgeR

Got 6 samples, and got: 7 data fields.

Header: 1out 2out 3out 4out 5out 6out

Next: Olr1501 0.00 0.00 0.00 0.00 0.00 0.00

$VAR1 = { ‘5out’ => 5, ‘6out’ => 6, ‘3out’ => 3, ‘1out’ => 1, ‘2out’ => 2, ‘4out’ => 4 };

$VAR1 = { ‘conditionB’ => [ ‘4out’, ‘5out’, ‘6out’ ], ‘conditionA’ => [ ‘1out’, ‘2out’, ‘3out’ ] };

Contrasts to perform are: $VAR1 = [ [ ‘conditionA’, ‘conditionB’ ] ];

CMD: R –no-save –no-restore –no-site-file –no-init-file -q < genes.isoform.counts.matrix.conditionA_vs_conditionB.conditionA.vs.conditionB.EdgeR.Rscript

……………

star-transcriptomeout$ ls -l genes_DE_3/

-rw-rw-r–. 1 bdash bdash 1410 Apr 13 02:12 genes.isoform.counts.matrix.conditionA_vs_conditionB.conditionA.vs.conditionB.EdgeR.Rscript

-rw-rw-r–. 1 bdash bdash 352277 Apr 13 02:13 genes.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.count_matrix

-rw-rw-r–. 1 bdash bdash 1010284 Apr 13 02:13 genes.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.DE_results

-rw-rw-r–. 1 bdash bdash 112695 Apr 13 02:13 genes.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.DE_results.MA_n_Volcano.pdf

-rw-rw-r–. 1 bdash bdash 355 Apr 13 02:21 genes.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.DE_results.P0.001_C2.conditionA-UP.subset

-rw-rw-r–. 1 bdash bdash 70 Apr 13 02:21 genes.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.DE_results.P0.001_C2.conditionB-UP.subset

-rw-rw-r–. 1 bdash bdash 355 Apr 13 02:21 genes.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.DE_results.P0.001_C2.DE.subset

-rw-rw-r–. 1 bdash bdash 96 Apr 13 02:21 genes.isoform.counts.matrix.conditionA_vs_conditionB.edgeR.DE_results.samples

genes_MA_plot

genes_MA_plot

genes_volcano_plot

genes_volcano_plot

Analyze differential gene expression: Produces heatmap and coorelation matrix

genes_DE_3$ analyze_diff_expr.pl 

--matrix ../genes_gene_trans_map_none/genes.isoform.TMM.EXPR.matrix 

--samples ../samples_described.txt 

--output DE_genes_3

Found 2 features as differentially expressed.

CMD: /home/bdash/miniconda2/opt/trinity-2.6.6/Analysis/DifferentialExpression/PtR -m DE_genes_3.matrix –log2 –heatmap –min_colSums 0 –min_rowSums 0 –gene_dist euclidean –sample_dist euclidean –sample_cor_matrix –center_rows –save -s ../samples_described.txt CMD: R –no-save –no-restore –no-site-file –no-init-file -q < DE_genes_3.matrix.R

……

star-transcriptomeout$ ls -l genes_DE_3/

-rw-rw-r–. 1 bdash bdash 53 Apr 13 02:21 DE_feature_counts.P0.001_C2.matrix

-rw-rw-r–. 1 bdash bdash 120 Apr 13 02:21 DE_genes_3.matrix

-rw-rw-r–. 1 bdash bdash 256 Apr 13 02:21 DE_genes_3.matrix.log2.centered.dat

-rw-rw-r–. 1 bdash bdash 5977 Apr 13 02:21 DE_genes_3.matrix.log2.centered.genes_vs_samples_heatmap.pdf

-rw-rw-r–. 1 bdash bdash 148 Apr 13 02:21 DE_genes_3.matrix.log2.centered.sample_cor.dat

-rw-rw-r–. 1 bdash bdash 6311 Apr 13 02:21 DE_genes_3.matrix.log2.centered.sample_cor_matrix.pdf

-rw-rw-r–. 1 bdash bdash 4435 Apr 13 02:21 DE_genes_3.matrix.R

-rw-rw-r–. 1 bdash bdash 33214 Apr 13 02:21 DE_genes_3.matrix.RData

pdf_convert('genes_DE_3/DE_genes_3.matrix.log2.centered.genes_vs_samples_heatmap.pdf', format = "jpeg", pages = NULL, filenames = NULL, dpi = 300, antialias = TRUE, opw = "", upw = "", verbose = TRUE)
Converting page 1 to DE_genes_3.matrix.log2.centered.genes_vs_samples_heatmap_1.jpeg... done!
[1] "DE_genes_3.matrix.log2.centered.genes_vs_samples_heatmap_1.jpeg"
genes_heatmap

genes_heatmap

pdf_convert('genes_DE_3/DE_genes_3.matrix.log2.centered.sample_cor_matrix.pdf', format = "jpeg", pages = NULL, filenames = NULL, dpi = 300, antialias = TRUE, opw = "", upw = "", verbose = TRUE)
Converting page 1 to DE_genes_3.matrix.log2.centered.sample_cor_matrix_1.jpeg... done!
[1] "DE_genes_3.matrix.log2.centered.sample_cor_matrix_1.jpeg"
genes_correlation_matrix

genes_correlation_matrix

LS0tDQp0aXRsZTogIkFuYWx5c2lzIG9mIGdlbmUgYW5kIGlzb2Zvcm0gZXhwcmVzc2lvbiBpbiBwcmVmcm9udGFsIGNvcnRleCAoUEZDKSBvZiByYXRzIGV4cG9zZWQgdG8gbmljb3RpbmU6IFN0YXItUlNFTS1lZGdlUiBwaXBlbGluZSINCmF1dGhvcjogIkJoYWdpcmF0aGkgRGFzaCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIDEuIFJlZmVyZW5jZXMgYW5kIHJlc291cmNlcw0KDQojIyMjIFJlZmVyZW5jZQ0KDQpQTG9TIE9uZS4gMjAxMzs4KDMpOmU1OTU4Mi4gZG9pOiAxMC4xMzcxL2pvdXJuYWwucG9uZS4wMDU5NTgyLg0KDQojIyMjIE1hY2hpbmUNCg0KQVdTIHI1LjJ4bGFyZ2UgYW5kIENlbnRPUyBsaW51eCA3IG9uIGEgVmlydHVhbCBNYWNoaW5lDQoNCiMjIyMgU29mdHdhcmUNCg0Kd2dldCBodHRwOi8vaGdkb3dubG9hZC5zb2UudWNzYy5lZHUvYWRtaW4vZXhlL2xpbnV4Lng4Nl82NC9nZW5lUHJlZFRvR3RmDQoNCg0KDQojIyAyLiBPYnRhaW4gYW5kL3Byb2Nlc3MgYW5hbHlzaXMgZGF0c2V0cw0KDQojIyMgTWFrZSBkaXJlY3RvcmllcyANCg0KIyMjIyB+L2RhdGEvcm5hc2VxL1JuL1BMb1MtT25lLTgtZTU5NTgyJCBscyAtbA0KDQpkcnd4cnd4ci14IDIgdWJ1bnR1IHVidW50dSA0MDk2IEFwciAxMCAwMjo0OCBmMzQ0X3BmY19uaWNvdGluZQ0KDQpkcnd4cnd4ci14IDIgdWJ1bnR1IHVidW50dSA0MDk2IEFwciAxMCAwMzoyOCBmMzQ0X3BmY19zYWxpbmUNCg0KDQojIyMgRG93bmxvYWQgc3JhIGZpbGVzIChuaWNvdGluZSBleHBvc2VkIHJhdCBQRkMpIHRvIGYzNDRfcGZjX25pY290aW5lIGRpcmVjdG9yeQ0KDQoNCiMjIyMgZjM0NF9wZmNfbmljb3RpbmUkIHdnZXQgZnRwOi8vZnRwLXRyYWNlLm5jYmkubmloLmdvdi9zcmEvc3JhLWluc3RhbnQvcmVhZHMvQnlSdW4vc3JhL1NSUi9TUlI4NjkvU1JSODY5MDMyL1NSUjg2OTAzMi5zcmENCg0KIyMjIyBmMzQ0X3BmY19uaWNvdGluZSQgd2dldCBmdHA6Ly9mdHAtdHJhY2UubmNiaS5uaWguZ292L3NyYS9zcmEtaW5zdGFudC9yZWFkcy9CeVJ1bi9zcmEvU1JSL1NSUjg2OS9TUlI4NjkwMzMvU1JSODY5MDMzLnNyYQ0KDQojIyMjIGYzNDRfcGZjX25pY290aW5lJCB3Z2V0IGZ0cDovL2Z0cC10cmFjZS5uY2JpLm5paC5nb3Yvc3JhL3NyYS1pbnN0YW50L3JlYWRzL0J5UnVuL3NyYS9TUlIvU1JSODY5L1NSUjg2OTAzNC9TUlI4NjkwMzQuc3JhDQoNCg0KDQoNCiMjIyBDb252ZXJ0IHNyYSBmaWxlcyB0byBmYXN0cSBmaWxlcw0KDQojIyMjIGYzNDRfcGZjX25pY290aW5lJCBmYXN0cS1kdW1wIC0tc3BsaXQtMyBTUlI4NjkwMzIuc3JhIC0tZ3ppcA0KDQojIyMjIGYzNDRfcGZjX25pY290aW5lJCBmYXN0cS1kdW1wIC0tc3BsaXQtMyBTUlI4NjkwMzMuc3JhIC0tZ3ppcA0KDQojIyMjIGYzNDRfcGZjX25pY290aW5lJCBmYXN0cS1kdW1wIC0tc3BsaXQtMyBTUlI4NjkwMzQuc3JhIC0tZ3ppcA0KDQoNCg0KIyMjIyBQTG9TLU9uZS04LWU1OTU4MiQgbHMgLWwgZjM0NF9wZmNfbmljb3RpbmUvDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDE5MTgzNzY4MjYgQXByICA3IDEzOjA4IFNSUjg2OTAzMi5zcmENCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMTUxMjcwMjg3MyBBcHIgMTAgMDM6MDcgU1JSODY5MDMyXzEuZmFzdHEuZ3oNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMTU2NTAyNzQyMSBBcHIgMTAgMDM6MDcgU1JSODY5MDMyXzIuZmFzdHEuZ3oNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMTk4OTA4NjI0MSBBcHIgIDcgMTM6MDkgU1JSODY5MDMzLnNyYQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxNTU5NTEwODE4IEFwciAxMCAwMzoxMSBTUlI4NjkwMzNfMS5mYXN0cS5neg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxNjEyMjU4NjE4IEFwciAxMCAwMzoxMSBTUlI4NjkwMzNfMi5mYXN0cS5neg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxOTc4MzI3NjY3IEFwciAgNyAxMzoxMCBTUlI4NjkwMzQuc3JhDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDE1Njg5Nzk3ODQgQXByIDEwIDAzOjEyIFNSUjg2OTAzNF8xLmZhc3RxLmd6DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDE2MTUzODUzMzEgQXByIDEwIDAzOjEyIFNSUjg2OTAzNF8yLmZhc3RxLmd6DQoNCg0KIyMjIERvd25sb2FkIHNyYSBmaWxlcyAoY29udHJvbC9zYWxpbmUgZXhwb3NlZCByYXQgUEZDKSB0byBmMzQ0X3BmY19zYWxpbmUgZGlyZWN0b3J5DQoNCg0KIyMjIyBmMzQ0X3BmY19zYWxpbmUkIHdnZXQgZnRwOi8vZnRwLXRyYWNlLm5jYmkubmloLmdvdi9zcmEvc3JhLWluc3RhbnQvcmVhZHMvQnlSdW4vc3JhL1NSUi9TUlI4NjkvU1JSODY5MDQ0L1NSUjg2OTA0NC5zcmENCg0KIyMjIyBmMzQ0X3BmY19zYWxpbmUkIHdnZXQgZnRwOi8vZnRwLXRyYWNlLm5jYmkubmloLmdvdi9zcmEvc3JhLWluc3RhbnQvcmVhZHMvQnlSdW4vc3JhL1NSUi9TUlI4NjkvU1JSODY5MDQ1L1NSUjg2OTA0NS5zcmENCg0KIyMjIyBmMzQ0X3BmY19zYWxpbmUkIHdnZXQgZnRwOi8vZnRwLXRyYWNlLm5jYmkubmloLmdvdi9zcmEvc3JhLWluc3RhbnQvcmVhZHMvQnlSdW4vc3JhL1NSUi9TUlI4NjkvU1JSODY5MDQ2L1NSUjg2OTA0Ni5zcmENCg0KDQoNCg0KIyMjIyBmMzQ0X3BmY19zYWxpbmUkIGZhc3RxLWR1bXAgLS1zcGxpdC0zIFNSUjg2OTA0NC5zcmEgLS1nemlwDQoNCiMjIyMgZjM0NF9wZmNfc2FsaW5lJCBmYXN0cS1kdW1wIC0tc3BsaXQtMyBTUlI4NjkwNDUuc3JhIC0tZ3ppcA0KDQojIyMjIGYzNDRfcGZjX3NhbGluZSQgZmFzdHEtZHVtcCAtLXNwbGl0LTMgU1JSODY5MDQ2LnNyYSAtLWd6aXANCg0KDQoNCiMjIyMgUExvUy1PbmUtOC1lNTk1ODIkIGxzIC1sIGYzNDRfcGZjX3NhbGluZS8NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMjY4MTMzMDA3NCBBcHIgIDcgMTI6NTkgU1JSODY5MDQ0LnNyYQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAyMTE5NzQ1OTU1IEFwciAxMCAwMzoxMCBTUlI4NjkwNDRfMS5mYXN0cS5neg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAyMjAyNTgwNDgyIEFwciAxMCAwMzoxMCBTUlI4NjkwNDRfMi5mYXN0cS5neg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAyNzA5MzgzMTk0IEFwciAgNyAxMzowMSBTUlI4NjkwNDUuc3JhDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDIxMDM4OTIwOTcgQXByIDEwIDAzOjEyIFNSUjg2OTA0NV8xLmZhc3RxLmd6DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDIxOTgzNjMwNjIgQXByIDEwIDAzOjEyIFNSUjg2OTA0NV8yLmZhc3RxLmd6DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDI2MTQwMjMzMjggQXByICA3IDEzOjAyIFNSUjg2OTA0Ni5zcmENCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMjA1NDk0MjM3NSBBcHIgMTAgMDM6MTMgU1JSODY5MDQ2XzEuZmFzdHEuZ3oNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgMjEzODQ0NjI2OSBBcHIgMTAgMDM6MTMgU1JSODY5MDQ2XzIuZmFzdHEuZ3oNCg0KDQoNCiMjIDMuIE9idGFpbiwgcHJvY2VzcyBhbmQvb3IgYnVpbGQgZ2Vub21lLCByZWZlcmVuY2UgYW5kIGluZGV4IGRhdGFzZXRzDQoNCg0KIyMjIERvd25sb2FkIHRoZSBnZW5vbWUgZmlsZSBhbmQgaW5kZXggaXQNCg0KDQojIyMjIHdnZXQgaHR0cDovL2hnZG93bmxvYWQuc29lLnVjc2MuZWR1L2dvbGRlblBhdGgvcm42L2JpZ1ppcHMvcm42LmZhLmd6DQoNCg0KIyMjIyBzYW10b29scyBmYWlkeCBybjYuZmENCg0KDQojIyMjIHJuNiQgbHMgLWwNCg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAyOTI3NjA3MzMzIEFwciAgOSAxOToyNiBybjYuZmENCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICA0MDY1NCBBcHIgIDkgMTk6MjYgcm42LmZhLmZhaQ0KDQoNCg0KDQojIyMgRG93bmxvYWQgdGhlIHJlZkdlbmUgZmlsZSBhbmQgY29udmVydCBpdCB0byBhIEdURiBmaWxlDQoNCg0KIyMjIyB3Z2V0IGh0dHA6Ly9oZ2Rvd25sb2FkLnNvZS51Y3NjLmVkdS9nb2xkZW5QYXRoL3JuNi9kYXRhYmFzZS9yZWZHZW5lLnR4dC5neg0KDQojIyMjIGd1bnppcCByZWZHZW5lLnR4dC5neiANCiANCiMjIyMgY3V0IC1mIDItIHJlZkdlbmUudHh0ID4gcmVmR2VuZS5pbnB1dA0KDQojIyMjIGdlbmVQcmVkVG9HdGYgZmlsZSByZWZHZW5lLmlucHV0IHJlZkdlbmUuZ3RmDQogDQoNCiMjIyMgZ2Vub21lX3JhdCQgbHMgLWwgIA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgIDYxODkxMzQxIEFwciAgOSAxOToyNyByZWZHZW5lLmd0Zg0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICA1MTQzMzgwIEFwciAgOSAxOToyNyByZWZHZW5lLmlucHV0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgIDUyMjY1MDcgQXByICA5IDE5OjI3IHJlZkdlbmUudHh0DQoNCg0KDQoNCg0KDQoNCiMjIyA0LiBCdWlsZCBhIFNUQVIgaW5kZXggZm9yIHRoZSByYXQgZ2VuZW9tZQ0KDQoNCmBgYA0KJCBTVEFSIC0tcnVuVGhyZWFkTiAxNiAtLXJ1bk1vZGUgZ2Vub21lR2VuZXJhdGUgLS1nZW5vbWVEaXIgU3RhckluZGV4UmF0LyAtLWdlbm9tZUZhc3RhRmlsZXMgcm42L3JuNi5mYQ0KDQpgYGANCg0KDQpBcHIgMDkgMTg6Mzk6MDQgLi4uLi4gc3RhcnRlZCBTVEFSIHJ1bg0KDQpBcHIgMDkgMTg6Mzk6MDQgLi4uIHN0YXJ0aW5nIHRvIGdlbmVyYXRlIEdlbm9tZSBmaWxlcw0KDQpBcHIgMDkgMTg6NDA6MTggLi4uIHN0YXJ0aW5nIHRvIHNvcnQgU3VmZml4IEFycmF5LiBUaGlzIG1heSB0YWtlIGEgbG9uZyB0aW1lLi4uDQoNCkFwciAwOSAxODo0MDozMiAuLi4gc29ydGluZyBTdWZmaXggQXJyYXkgY2h1bmtzIGFuZCBzYXZpbmcgdGhlbSB0byBkaXNrLi4uDQoNCkFwciAwOSAxOTowNTozMyAuLi4gbG9hZGluZyBjaHVua3MgZnJvbSBkaXNrLCBwYWNraW5nIFNBLi4uDQoNCkFwciAwOSAxOTowNjo0MiAuLi4gZmluaXNoZWQgZ2VuZXJhdGluZyBzdWZmaXggYXJyYXkNCg0KQXByIDA5IDE5OjA2OjQyIC4uLiBnZW5lcmF0aW5nIFN1ZmZpeCBBcnJheSBpbmRleA0KDQpBcHIgMDkgMTk6MTA6NTcgLi4uIGNvbXBsZXRlZCBTdWZmaXggQXJyYXkgaW5kZXgNCg0KQXByIDA5IDE5OjEwOjU3IC4uLiB3cml0aW5nIEdlbm9tZSB0byBkaXNrIC4uLg0KDQpBcHIgMDkgMTk6MTA6NTkgLi4uIHdyaXRpbmcgU3VmZml4IEFycmF5IHRvIGRpc2sgLi4uDQoNCkFwciAwOSAxOToxMjoxOSAuLi4gd3JpdGluZyBTQWluZGV4IHRvIGRpc2sNCg0KQXByIDA5IDE5OjEyOjI3IC4uLi4uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQ0KDQoNCiMjIyMgU3RhckluZGV4UmF0JCBscyAtbA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMzA5NTEzNDIwOCBBcHIgIDkgMTk6MTAgR2Vub21lDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDIyNTIxMzUxNjQ1IEFwciAgOSAxOToxMiBTQQ0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgMTU2NTg3MzYxOSBBcHIgIDkgMTk6MTIgU0FpbmRleA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAgNTIxMyBBcHIgIDkgMTg6NDAgY2hyTGVuZ3RoLnR4dA0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAgICAgICAxOTM0NyBBcHIgIDkgMTg6NDAgY2hyTmFtZS50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgMjQ1NjAgQXByICA5IDE4OjQwIGNock5hbWVMZW5ndGgudHh0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgIDEwMzg3IEFwciAgOSAxODo0MCBjaHJTdGFydC50eHQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgICA0NzkgQXByICA5IDE5OjEwIGdlbm9tZVBhcmFtZXRlcnMudHh0DQoNCg0KDQoNCg0KDQoNCiMjIDUuIEFsaWduIHRoZSBmYXN0cS5neiBmaWxlcyB0byBvYnRhaW4gQkFNIGZpbGVzDQoNCg0KYGBgDQogfi9yZXN1bHRzL3JuYXNlcS9Sbi9zdGFyX3JhdCQgU1RBUiANCiANCiAtLXJ1blRocmVhZE4gMTIgDQogDQogLS1nZW5vbWVEaXIgU3RhckluZGV4UmF0LyANCiANCiAtLXNqZGJHVEZmaWxlIH4vZ2Vub21lX3JhdC9yZWZHZW5lLmd0ZiANCiANCiAtLXNqZGJPdmVyaGFuZyAxMDAgDQogDQogLS1yZWFkRmlsZXNJbiB+L1BMb1MtT25lLTgtZTU5NTgyL2YzNDRfcGZjX3NhbGluZS9TUlI4NjkwNDRfMS5mYXN0cS5neg0KIA0KIH4vUExvUy1PbmUtOC1lNTk1ODIvZjM0NF9wZmNfc2FsaW5lL1NSUjg2OTA0NF8yLmZhc3RxLmd6IA0KIA0KIC0tcmVhZEZpbGVzQ29tbWFuZCB6Y2F0IA0KIA0KIC0tcXVhbnRNb2RlIFRyYW5zY3JpcHRvbWVTQU0gDQogDQogLS1vdXRGaWxlTmFtZVByZWZpeCAxYWxpZ24vDQogDQogYGBgDQoNCkFwciAxMCAwMzozMDozMCAuLi4uLiBzdGFydGVkIFNUQVIgcnVuDQoNCkFwciAxMCAwMzozMDozMCAuLi4uLiBsb2FkaW5nIGdlbm9tZQ0KDQpBcHIgMTAgMDM6MzI6MzkgLi4uLi4gcHJvY2Vzc2luZyBhbm5vdGF0aW9ucyBHVEYNCg0KQXByIDEwIDAzOjMyOjQzIC4uLi4uIGluc2VydGluZyBqdW5jdGlvbnMgaW50byB0aGUgZ2Vub21lIGluZGljZXMNCg0KQXByIDEwIDAzOjM3OjIzIC4uLi4uIHN0YXJ0ZWQgbWFwcGluZw0KDQpBcHIgMTAgMDM6NDI6MjkgLi4uLi4gZmluaXNoZWQgc3VjY2Vzc2Z1bGx5DQoNCg0KDQojIyMjICQgbHMgLWwgMWFsaWduLw0KDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDE1OTMzNDQ0OTg2IEFwciAxMCAwMzo0MiBBbGlnbmVkLm91dC5zYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDIzNTg2NDM1NzkgQXByIDEwIDAzOjQyIEFsaWduZWQudG9UcmFuc2NyaXB0b21lLm91dC5iYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDE4NjIgQXByIDEwIDAzOjQyIExvZy5maW5hbC5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAyNzI5MzUgQXByIDEwIDAzOjQyIExvZy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgICA4MzYgQXByIDEwIDAzOjQyIExvZy5wcm9ncmVzcy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDczNjg4ODYgQXByIDEwIDAzOjQyIFNKLm91dC50YWINCg0KZHJ3eC0tLS0tLSAyIHVidW50dSB1YnVudHUgICAgICAgIDQwOTYgQXByIDEwIDAzOjMyIF9TVEFSZ2Vub21lDQoNCg0KDQojIyMjICQgY2F0IDFhbGlnbi9Mb2cuZmluYWwub3V0IA0KDQoNCmBgYA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRlZCBqb2Igb24gfAlBcHIgMTAgMDM6MzA6MzANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRlZCBtYXBwaW5nIG9uIHwJQXByIDEwIDAzOjM3OjIzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5pc2hlZCBvbiB8CUFwciAxMCAwMzo0MjoyOQ0KICAgICAgIE1hcHBpbmcgc3BlZWQsIE1pbGxpb24gb2YgcmVhZHMgcGVyIGhvdXIgfAk0ODkuMjMNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgaW5wdXQgcmVhZHMgfAk0MTU4NDg5MQ0KICAgICAgICAgICAgICAgICAgICAgIEF2ZXJhZ2UgaW5wdXQgcmVhZCBsZW5ndGggfAkxMDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSVFVRSBSRUFEUzoNCiAgICAgICAgICAgICAgICAgICBVbmlxdWVseSBtYXBwZWQgcmVhZHMgbnVtYmVyIHwJMzQ3OTYzMzENCiAgICAgICAgICAgICAgICAgICAgICAgIFVuaXF1ZWx5IG1hcHBlZCByZWFkcyAlIHwJODMuNjglDQogICAgICAgICAgICAgICAgICAgICAgICAgIEF2ZXJhZ2UgbWFwcGVkIGxlbmd0aCB8CTk5LjM3DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBUb3RhbCB8CTc5MTAxOTkNCiAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBBbm5vdGF0ZWQgKHNqZGIpIHwJNzE5NDk0MA0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogR1QvQUcgfAk3NzY0Njc3DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBHQy9BRyB8CTYyMDA0DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBBVC9BQyB8CTc2MzQNCiAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBOb24tY2Fub25pY2FsIHwJNzU4ODQNCiAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaCByYXRlIHBlciBiYXNlLCAlIHwJMC4zNyUNCiAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGlvbiByYXRlIHBlciBiYXNlIHwJMC4wMSUNCiAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uIGF2ZXJhZ2UgbGVuZ3RoIHwJMS42MQ0KICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0aW9uIHJhdGUgcGVyIGJhc2UgfAkwLjAwJQ0KICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRpb24gYXZlcmFnZSBsZW5ndGggfAkxLjM1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1VTFRJLU1BUFBJTkcgUkVBRFM6DQogICAgICAgIE51bWJlciBvZiByZWFkcyBtYXBwZWQgdG8gbXVsdGlwbGUgbG9jaSB8CTI1NTM4NTINCiAgICAgICAgICAgICAlIG9mIHJlYWRzIG1hcHBlZCB0byBtdWx0aXBsZSBsb2NpIHwJNi4xNCUNCiAgICAgICAgTnVtYmVyIG9mIHJlYWRzIG1hcHBlZCB0byB0b28gbWFueSBsb2NpIHwJNTczMDgNCiAgICAgICAgICAgICAlIG9mIHJlYWRzIG1hcHBlZCB0byB0b28gbWFueSBsb2NpIHwJMC4xNCUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTk1BUFBFRCBSRUFEUzoNCiAgICAgICAlIG9mIHJlYWRzIHVubWFwcGVkOiB0b28gbWFueSBtaXNtYXRjaGVzIHwJMC4wMCUNCiAgICAgICAgICAgICAgICAgJSBvZiByZWFkcyB1bm1hcHBlZDogdG9vIHNob3J0IHwJOS45MiUNCiAgICAgICAgICAgICAgICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IG90aGVyIHwJMC4xMyUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSElNRVJJQyBSRUFEUzoNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGNoaW1lcmljIHJlYWRzIHwJMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgb2YgY2hpbWVyaWMgcmVhZHMgfAkwLjAwJQ0KDQpgYGANCg0KDQoNCg0KYGBgDQp+L3Jlc3VsdHMvcm5hc2VxL1JuL3N0YXJfcmF0L3RyYW5zY3JpcHRvbWVPdXQkIFNUQVIgLS1ydW5UaHJlYWROIDEyIC0tZ2Vub21lRGlyIH4vZ2Vub21lQW5kSW5kaWNlcy9Sbi9zdGFyLyAtLXNqZGJHVEZmaWxlIH4vZ2Vub21lQW5kSW5kaWNlcy9Sbi9ybjYucmVmR2VuZS5ndGYgLS1zamRiT3ZlcmhhbmcgMTAwIC0tcmVhZEZpbGVzSW4gfi9kYXRhL3JuYXNlcS9Sbi9QTG9TLU9uZS04LWU1OTU4Mi9mMzQ0X3BmY19zYWxpbmUvU1JSODY5MDQ1XzEuZmFzdHEuZ3ogfi9kYXRhL3JuYXNlcS9Sbi9QTG9TLU9uZS04LWU1OTU4Mi9mMzQ0X3BmY19zYWxpbmUvU1JSODY5MDQ1XzIuZmFzdHEuZ3ogLS1yZWFkRmlsZXNDb21tYW5kIHpjYXQgLS1xdWFudE1vZGUgVHJhbnNjcmlwdG9tZVNBTSAtLW91dEZpbGVOYW1lUHJlZml4IDJhbGlnbi8NCg0KYGBgDQoNCg0KQXByIDExIDE1OjA4OjE5IC4uLi4uIHN0YXJ0ZWQgU1RBUiBydW4NCg0KQXByIDExIDE1OjA4OjIwIC4uLi4uIGxvYWRpbmcgZ2Vub21lDQoNCkFwciAxMSAxNToxMjowMSAuLi4uLiBwcm9jZXNzaW5nIGFubm90YXRpb25zIEdURg0KDQpBcHIgMTEgMTU6MTI6MjUgLi4uLi4gaW5zZXJ0aW5nIGp1bmN0aW9ucyBpbnRvIHRoZSBnZW5vbWUgaW5kaWNlcw0KDQpBcHIgMTEgMTU6Mzc6NDYgLi4uLi4gc3RhcnRlZCBtYXBwaW5nDQoNCkFwciAxMSAxNTo1ODo1NCAuLi4uLiBmaW5pc2hlZCBzdWNjZXNzZnVsbHkNCg0KDQojIyMjICQgbHMgLWwgMmFsaWduLw0KDQotcnctcnctci0tIDEgdWJ1bnR1IHVidW50dSAxNDg2OTQzNjY0NCBBcHIgMTEgMTU6NTggQWxpZ25lZC5vdXQuc2FtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAyMjE2MTY2NjY4IEFwciAxMSAxNTo1OCBBbGlnbmVkLnRvVHJhbnNjcmlwdG9tZS5vdXQuYmFtDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAxODYzIEFwciAxMSAxNTo1OCBMb2cuZmluYWwub3V0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgMjkwOTcxIEFwciAxMSAxNTo1OCBMb2cub3V0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICAgICAyNDg4IEFwciAxMSAxNTo1OCBMb2cucHJvZ3Jlc3Mub3V0DQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1ICAgICA3Mjc4OTUzIEFwciAxMSAxNTo1OCBTSi5vdXQudGFiDQoNCmRyd3gtLS0tLS0gMiB1YnVudHUgdWJ1bnR1ICAgICAgICA0MDk2IEFwciAxMSAxNToxMiBfU1RBUmdlbm9tZQ0KDQoNCg0KDQojIyMjICQgY2F0IDJhbGlnbi9Mb2cuZmluYWwub3V0IA0KDQoNCg0KYGBgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydGVkIGpvYiBvbiB8CUFwciAxMSAxNTowODoxOQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydGVkIG1hcHBpbmcgb24gfAlBcHIgMTEgMTU6Mzc6NDYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmlzaGVkIG9uIHwJQXByIDExIDE1OjU4OjU0DQogICAgICAgTWFwcGluZyBzcGVlZCwgTWlsbGlvbiBvZiByZWFkcyBwZXIgaG91ciB8CTExNi4wMg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBpbnB1dCByZWFkcyB8CTQwODY2MDM1DQogICAgICAgICAgICAgICAgICAgICAgQXZlcmFnZSBpbnB1dCByZWFkIGxlbmd0aCB8CTEwMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JUVVFIFJFQURTOg0KICAgICAgICAgICAgICAgICAgIFVuaXF1ZWx5IG1hcHBlZCByZWFkcyBudW1iZXIgfAkzMjU5NDExNQ0KICAgICAgICAgICAgICAgICAgICAgICAgVW5pcXVlbHkgbWFwcGVkIHJlYWRzICUgfAk3OS43NiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgQXZlcmFnZSBtYXBwZWQgbGVuZ3RoIHwJOTkuMzUNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IFRvdGFsIHwJNzM3MjE4MQ0KICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEFubm90YXRlZCAoc2pkYikgfAk2Njk1MTU1DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBHVC9BRyB8CTcyMzUxMzUNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEdDL0FHIHwJNTg1MjMNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEFUL0FDIHwJNjk5NQ0KICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IE5vbi1jYW5vbmljYWwgfAk3MTUyOA0KICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoIHJhdGUgcGVyIGJhc2UsICUgfAkwLjM4JQ0KICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uIHJhdGUgcGVyIGJhc2UgfAkwLjAxJQ0KICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRpb24gYXZlcmFnZSBsZW5ndGggfAkxLjYxDQogICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRpb24gcmF0ZSBwZXIgYmFzZSB8CTAuMDElDQogICAgICAgICAgICAgICAgICAgICAgIEluc2VydGlvbiBhdmVyYWdlIGxlbmd0aCB8CTEuMzUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVVMVEktTUFQUElORyBSRUFEUzoNCiAgICAgICAgTnVtYmVyIG9mIHJlYWRzIG1hcHBlZCB0byBtdWx0aXBsZSBsb2NpIHwJMjM1MzkwMw0KICAgICAgICAgICAgICUgb2YgcmVhZHMgbWFwcGVkIHRvIG11bHRpcGxlIGxvY2kgfAk1Ljc2JQ0KICAgICAgICBOdW1iZXIgb2YgcmVhZHMgbWFwcGVkIHRvIHRvbyBtYW55IGxvY2kgfAk1Mjg3Ng0KICAgICAgICAgICAgICUgb2YgcmVhZHMgbWFwcGVkIHRvIHRvbyBtYW55IGxvY2kgfAkwLjEzJQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOTUFQUEVEIFJFQURTOg0KICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IHRvbyBtYW55IG1pc21hdGNoZXMgfAkwLjAwJQ0KICAgICAgICAgICAgICAgICAlIG9mIHJlYWRzIHVubWFwcGVkOiB0b28gc2hvcnQgfAkxNC4yMyUNCiAgICAgICAgICAgICAgICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IG90aGVyIHwJMC4xMiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSElNRVJJQyBSRUFEUzoNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGNoaW1lcmljIHJlYWRzIHwJMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgb2YgY2hpbWVyaWMgcmVhZHMgfAkwLjAwJQ0KDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCmBgYA0Kfi9yZXN1bHRzL3JuYXNlcS9Sbi9zdGFyX3JhdC90cmFuc2NyaXB0b21lT3V0JCBTVEFSIC0tcnVuVGhyZWFkTiAxMiAtLWdlbm9tZURpciB+L2dlbm9tZUFuZEluZGljZXMvUm4vc3Rhci8gLS1zamRiR1RGZmlsZSB+L2dlbm9tZUFuZEluZGljZXMvUm4vcm42LnJlZkdlbmUuZ3RmIC0tc2pkYk92ZXJoYW5nIDEwMCAtLXJlYWRGaWxlc0luIH4vZGF0YS9ybmFzZXEvUm4vUExvUy1PbmUtOC1lNTk1ODIvZjM0NF9wZmNfc2FsaW5lL1NSUjg2OTA0Nl8xLmZhc3RxLmd6IH4vZGF0YS9ybmFzZXEvUm4vUExvUy1PbmUtOC1lNTk1ODIvZjM0NF9wZmNfc2FsaW5lL1NSUjg2OTA0Nl8yLmZhc3RxLmd6IC0tcmVhZEZpbGVzQ29tbWFuZCB6Y2F0IC0tcXVhbnRNb2RlIFRyYW5zY3JpcHRvbWVTQU0gLS1vdXRGaWxlTmFtZVByZWZpeCAzYWxpZ24vDQoNCmBgYA0KDQpBcHIgMTEgMTY6MDA6NTIgLi4uLi4gc3RhcnRlZCBTVEFSIHJ1bg0KDQpBcHIgMTEgMTY6MDA6NTIgLi4uLi4gbG9hZGluZyBnZW5vbWUNCg0KQXByIDExIDE2OjAyOjM1IC4uLi4uIHByb2Nlc3NpbmcgYW5ub3RhdGlvbnMgR1RGDQoNCkFwciAxMSAxNjowMjozNyAuLi4uLiBpbnNlcnRpbmcganVuY3Rpb25zIGludG8gdGhlIGdlbm9tZSBpbmRpY2VzDQoNCkFwciAxMSAxNjowNToyMyAuLi4uLiBzdGFydGVkIG1hcHBpbmcNCg0KQXByIDExIDE2OjExOjI5IC4uLi4uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQ0KDQoNCiMjIyMgJCBscyAtbCAzYWxpZ24vDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDE0OTk4MzE5MjQ1IEFwciAxMSAxNjoxMSBBbGlnbmVkLm91dC5zYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDIxODM4MTQ2MzEgQXByIDExIDE2OjExIEFsaWduZWQudG9UcmFuc2NyaXB0b21lLm91dC5iYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDE4NjMgQXByIDExIDE2OjExIExvZy5maW5hbC5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAyOTA5NzAgQXByIDExIDE2OjExIExvZy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgICA5NTQgQXByIDExIDE2OjExIExvZy5wcm9ncmVzcy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDcyMjA5MjMgQXByIDExIDE2OjExIFNKLm91dC50YWINCg0KZHJ3eC0tLS0tLSAyIHVidW50dSB1YnVudHUgICAgICAgIDQwOTYgQXByIDExIDE2OjAyIF9TVEFSZ2Vub21lDQoNCg0KDQojIyMjICQgY2F0IDNhbGlnbi9Mb2cuZmluYWwub3V0IA0KDQpgYGANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0ZWQgam9iIG9uIHwJQXByIDExIDE2OjAwOjUyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0ZWQgbWFwcGluZyBvbiB8CUFwciAxMSAxNjowNToyMw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluaXNoZWQgb24gfAlBcHIgMTEgMTY6MTE6MjkNCiAgICAgICBNYXBwaW5nIHNwZWVkLCBNaWxsaW9uIG9mIHJlYWRzIHBlciBob3VyIHwJMzg3LjI2DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGlucHV0IHJlYWRzIHwJMzkzNzA5MzUNCiAgICAgICAgICAgICAgICAgICAgICBBdmVyYWdlIGlucHV0IHJlYWQgbGVuZ3RoIHwJMTAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklRVUUgUkVBRFM6DQogICAgICAgICAgICAgICAgICAgVW5pcXVlbHkgbWFwcGVkIHJlYWRzIG51bWJlciB8CTMyNzE3OTU4DQogICAgICAgICAgICAgICAgICAgICAgICBVbmlxdWVseSBtYXBwZWQgcmVhZHMgJSB8CTgzLjEwJQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBBdmVyYWdlIG1hcHBlZCBsZW5ndGggfAk5OS4zNQ0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogVG90YWwgfAk3MTAyMzI4DQogICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogQW5ub3RhdGVkIChzamRiKSB8CTY0NTgyMDYNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEdUL0FHIHwJNjk3MTM5MQ0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogR0MvQUcgfAk1NTYzNA0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogQVQvQUMgfAk2OTk5DQogICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogTm9uLWNhbm9uaWNhbCB8CTY4MzA0DQogICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2ggcmF0ZSBwZXIgYmFzZSwgJSB8CTAuNDAlDQogICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRpb24gcmF0ZSBwZXIgYmFzZSB8CTAuMDElDQogICAgICAgICAgICAgICAgICAgICAgICBEZWxldGlvbiBhdmVyYWdlIGxlbmd0aCB8CTEuNjENCiAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydGlvbiByYXRlIHBlciBiYXNlIHwJMC4wMSUNCiAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0aW9uIGF2ZXJhZ2UgbGVuZ3RoIHwJMS4zNQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVUxUSS1NQVBQSU5HIFJFQURTOg0KICAgICAgICBOdW1iZXIgb2YgcmVhZHMgbWFwcGVkIHRvIG11bHRpcGxlIGxvY2kgfAkyNDYyMzA5DQogICAgICAgICAgICAgJSBvZiByZWFkcyBtYXBwZWQgdG8gbXVsdGlwbGUgbG9jaSB8CTYuMjUlDQogICAgICAgIE51bWJlciBvZiByZWFkcyBtYXBwZWQgdG8gdG9vIG1hbnkgbG9jaSB8CTUxOTE3DQogICAgICAgICAgICAgJSBvZiByZWFkcyBtYXBwZWQgdG8gdG9vIG1hbnkgbG9jaSB8CTAuMTMlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5NQVBQRUQgUkVBRFM6DQogICAgICAgJSBvZiByZWFkcyB1bm1hcHBlZDogdG9vIG1hbnkgbWlzbWF0Y2hlcyB8CTAuMDAlDQogICAgICAgICAgICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IHRvbyBzaG9ydCB8CTEwLjM4JQ0KICAgICAgICAgICAgICAgICAgICAgJSBvZiByZWFkcyB1bm1hcHBlZDogb3RoZXIgfAkwLjEzJQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENISU1FUklDIFJFQURTOg0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgY2hpbWVyaWMgcmVhZHMgfAkwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBvZiBjaGltZXJpYyByZWFkcyB8CTAuMDAlDQoNCmBgYA0KDQoNCg0KYGBgDQp+L3Jlc3VsdHMvcm5hc2VxL1JuL3N0YXJfcmF0L3RyYW5zY3JpcHRvbWVPdXQkIFNUQVIgLS1ydW5UaHJlYWROIDEyIC0tZ2Vub21lRGlyIH4vZ2Vub21lQW5kSW5kaWNlcy9Sbi9zdGFyLyAtLXNqZGJHVEZmaWxlIH4vZ2Vub21lQW5kSW5kaWNlcy9Sbi9ybjYucmVmR2VuZS5ndGYgLS1zamRiT3ZlcmhhbmcgMTAwIC0tcmVhZEZpbGVzSW4gfi9kYXRhL3JuYXNlcS9Sbi9QTG9TLU9uZS04LWU1OTU4Mi9mMzQ0X3BmY19uaWNvdGluZS9TUlI4NjkwMzJfMS5mYXN0cS5neiB+L2RhdGEvcm5hc2VxL1JuL1BMb1MtT25lLTgtZTU5NTgyL2YzNDRfcGZjX25pY290aW5lL1NSUjg2OTAzMl8yLmZhc3RxLmd6IC0tcmVhZEZpbGVzQ29tbWFuZCB6Y2F0IC0tcXVhbnRNb2RlIFRyYW5zY3JpcHRvbWVTQU0gLS1vdXRGaWxlTmFtZVByZWZpeCA0YWxpZ24vDQoNCmBgYA0KDQpBcHIgMTEgMTY6MjE6MjYgLi4uLi4gc3RhcnRlZCBTVEFSIHJ1bg0KDQpBcHIgMTEgMTY6MjE6MjYgLi4uLi4gbG9hZGluZyBnZW5vbWUNCg0KQXByIDExIDE2OjIzOjA5IC4uLi4uIHByb2Nlc3NpbmcgYW5ub3RhdGlvbnMgR1RGDQoNCkFwciAxMSAxNjoyMzoxMCAuLi4uLiBpbnNlcnRpbmcganVuY3Rpb25zIGludG8gdGhlIGdlbm9tZSBpbmRpY2VzDQoNCkFwciAxMSAxNjoyNToyNCAuLi4uLiBzdGFydGVkIG1hcHBpbmcNCg0KQXByIDExIDE2OjI4OjU4IC4uLi4uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQ0KDQoNCg0KDQojIyMjICQgbHMgLWwgNGFsaWduLw0KDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDEwOTMzMTE2Mzk1IEFwciAxMSAxNjoyOCBBbGlnbmVkLm91dC5zYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDE2MTc3NzUzMTEgQXByIDExIDE2OjI4IEFsaWduZWQudG9UcmFuc2NyaXB0b21lLm91dC5iYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDE4NjMgQXByIDExIDE2OjI4IExvZy5maW5hbC5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAyOTEwMDYgQXByIDExIDE2OjI4IExvZy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgICA2MDAgQXByIDExIDE2OjI4IExvZy5wcm9ncmVzcy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDY3NzgwNzUgQXByIDExIDE2OjI4IFNKLm91dC50YWINCg0KZHJ3eC0tLS0tLSAyIHVidW50dSB1YnVudHUgICAgICAgIDQwOTYgQXByIDExIDE2OjIzIF9TVEFSZ2Vub21lDQoNCg0KDQojIyMjICQgY2F0IDRhbGlnbi9Mb2cuZmluYWwub3V0IA0KDQoNCmBgYA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRlZCBqb2Igb24gfAlBcHIgMTEgMTY6MjE6MjYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRlZCBtYXBwaW5nIG9uIHwJQXByIDExIDE2OjI1OjI0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5pc2hlZCBvbiB8CUFwciAxMSAxNjoyODo1OA0KICAgICAgIE1hcHBpbmcgc3BlZWQsIE1pbGxpb24gb2YgcmVhZHMgcGVyIGhvdXIgfAk0ODYuNjYNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgaW5wdXQgcmVhZHMgfAkyODkyOTQ4NQ0KICAgICAgICAgICAgICAgICAgICAgIEF2ZXJhZ2UgaW5wdXQgcmVhZCBsZW5ndGggfAkxMDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSVFVRSBSRUFEUzoNCiAgICAgICAgICAgICAgICAgICBVbmlxdWVseSBtYXBwZWQgcmVhZHMgbnVtYmVyIHwJMjM4ODQ4NTANCiAgICAgICAgICAgICAgICAgICAgICAgIFVuaXF1ZWx5IG1hcHBlZCByZWFkcyAlIHwJODIuNTYlDQogICAgICAgICAgICAgICAgICAgICAgICAgIEF2ZXJhZ2UgbWFwcGVkIGxlbmd0aCB8CTk5LjM3DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBUb3RhbCB8CTUzMzc1OTENCiAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBBbm5vdGF0ZWQgKHNqZGIpIHwJNDg0MzY5OA0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogR1QvQUcgfAk1MjM3Mjg0DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBHQy9BRyB8CTQyMzYwDQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBBVC9BQyB8CTUxMjYNCiAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBOb24tY2Fub25pY2FsIHwJNTI4MjENCiAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaCByYXRlIHBlciBiYXNlLCAlIHwJMC4zOCUNCiAgICAgICAgICAgICAgICAgICAgICAgICBEZWxldGlvbiByYXRlIHBlciBiYXNlIHwJMC4wMSUNCiAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uIGF2ZXJhZ2UgbGVuZ3RoIHwJMS42MQ0KICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0aW9uIHJhdGUgcGVyIGJhc2UgfAkwLjAxJQ0KICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRpb24gYXZlcmFnZSBsZW5ndGggfAkxLjM1DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1VTFRJLU1BUFBJTkcgUkVBRFM6DQogICAgICAgIE51bWJlciBvZiByZWFkcyBtYXBwZWQgdG8gbXVsdGlwbGUgbG9jaSB8CTE3NDUyMTANCiAgICAgICAgICAgICAlIG9mIHJlYWRzIG1hcHBlZCB0byBtdWx0aXBsZSBsb2NpIHwJNi4wMyUNCiAgICAgICAgTnVtYmVyIG9mIHJlYWRzIG1hcHBlZCB0byB0b28gbWFueSBsb2NpIHwJNDE3NTkNCiAgICAgICAgICAgICAlIG9mIHJlYWRzIG1hcHBlZCB0byB0b28gbWFueSBsb2NpIHwJMC4xNCUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTk1BUFBFRCBSRUFEUzoNCiAgICAgICAlIG9mIHJlYWRzIHVubWFwcGVkOiB0b28gbWFueSBtaXNtYXRjaGVzIHwJMC4wMCUNCiAgICAgICAgICAgICAgICAgJSBvZiByZWFkcyB1bm1hcHBlZDogdG9vIHNob3J0IHwJMTEuMTMlDQogICAgICAgICAgICAgICAgICAgICAlIG9mIHJlYWRzIHVubWFwcGVkOiBvdGhlciB8CTAuMTQlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hJTUVSSUMgUkVBRFM6DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBjaGltZXJpYyByZWFkcyB8CTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIG9mIGNoaW1lcmljIHJlYWRzIHwJMC4wMCUNCg0KYGBgDQoNCg0KDQoNCmBgYA0Kfi9yZXN1bHRzL3JuYXNlcS9Sbi9zdGFyX3JhdC90cmFuc2NyaXB0b21lT3V0JCBTVEFSIC0tcnVuVGhyZWFkTiAxMiAtLWdlbm9tZURpciB+L2dlbm9tZUFuZEluZGljZXMvUm4vc3Rhci8gLS1zamRiR1RGZmlsZSB+L2dlbm9tZUFuZEluZGljZXMvUm4vcm42LnJlZkdlbmUuZ3RmIC0tc2pkYk92ZXJoYW5nIDEwMCAtLXJlYWRGaWxlc0luIH4vZGF0YS9ybmFzZXEvUm4vUExvUy1PbmUtOC1lNTk1ODIvZjM0NF9wZmNfbmljb3RpbmUvU1JSODY5MDMzXzEuZmFzdHEuZ3ogfi9kYXRhL3JuYXNlcS9Sbi9QTG9TLU9uZS04LWU1OTU4Mi9mMzQ0X3BmY19uaWNvdGluZS9TUlI4NjkwMzNfMi5mYXN0cS5neiAtLXJlYWRGaWxlc0NvbW1hbmQgemNhdCAtLXF1YW50TW9kZSBUcmFuc2NyaXB0b21lU0FNIC0tb3V0RmlsZU5hbWVQcmVmaXggNWFsaWduLw0KDQpgYGANCg0KQXByIDExIDE2OjMyOjQ0IC4uLi4uIHN0YXJ0ZWQgU1RBUiBydW4NCg0KQXByIDExIDE2OjMyOjQ0IC4uLi4uIGxvYWRpbmcgZ2Vub21lDQoNCkFwciAxMSAxNjozNDoyNiAuLi4uLiBwcm9jZXNzaW5nIGFubm90YXRpb25zIEdURg0KDQpBcHIgMTEgMTY6MzQ6MjggLi4uLi4gaW5zZXJ0aW5nIGp1bmN0aW9ucyBpbnRvIHRoZSBnZW5vbWUgaW5kaWNlcw0KDQpBcHIgMTEgMTY6MzY6NDAgLi4uLi4gc3RhcnRlZCBtYXBwaW5nDQoNCkFwciAxMSAxNjo0MDoyNCAuLi4uLiBmaW5pc2hlZCBzdWNjZXNzZnVsbHkNCg0KDQojIyMjICQgbHMgLWwgNWFsaWduLw0KDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDExMTUyODcxNzE2IEFwciAxMSAxNjo0MCBBbGlnbmVkLm91dC5zYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDE2NTAzMTUwOTggQXByIDExIDE2OjQwIEFsaWduZWQudG9UcmFuc2NyaXB0b21lLm91dC5iYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDE4NjMgQXByIDExIDE2OjQwIExvZy5maW5hbC5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAyOTEwMDYgQXByIDExIDE2OjQwIExvZy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgICA2MDAgQXByIDExIDE2OjQwIExvZy5wcm9ncmVzcy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDY5NDMwMjggQXByIDExIDE2OjQwIFNKLm91dC50YWINCg0KZHJ3eC0tLS0tLSAyIHVidW50dSB1YnVudHUgICAgICAgIDQwOTYgQXByIDExIDE2OjM0IF9TVEFSZ2Vub21lDQoNCg0KDQoNCg0KIyMjIyAkIGNhdCA1YWxpZ24vTG9nLmZpbmFsLm91dCANCg0KYGBgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydGVkIGpvYiBvbiB8CUFwciAxMSAxNjozMjo0NA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydGVkIG1hcHBpbmcgb24gfAlBcHIgMTEgMTY6MzY6NDANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmlzaGVkIG9uIHwJQXByIDExIDE2OjQwOjI0DQogICAgICAgTWFwcGluZyBzcGVlZCwgTWlsbGlvbiBvZiByZWFkcyBwZXIgaG91ciB8CTQ4My4wNw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBpbnB1dCByZWFkcyB8CTMwMDU3NDU4DQogICAgICAgICAgICAgICAgICAgICAgQXZlcmFnZSBpbnB1dCByZWFkIGxlbmd0aCB8CTEwMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JUVVFIFJFQURTOg0KICAgICAgICAgICAgICAgICAgIFVuaXF1ZWx5IG1hcHBlZCByZWFkcyBudW1iZXIgfAkyNDI0MjAyNg0KICAgICAgICAgICAgICAgICAgICAgICAgVW5pcXVlbHkgbWFwcGVkIHJlYWRzICUgfAk4MC42NSUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgQXZlcmFnZSBtYXBwZWQgbGVuZ3RoIHwJOTkuMzkNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IFRvdGFsIHwJNTQ2NDMxMA0KICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEFubm90YXRlZCAoc2pkYikgfAk0OTY5ODQ1DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzcGxpY2VzOiBHVC9BRyB8CTUzNjUwMjMNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEdDL0FHIHwJNDI0ODENCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEFUL0FDIHwJNTE3OA0KICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IE5vbi1jYW5vbmljYWwgfAk1MTYyOA0KICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoIHJhdGUgcGVyIGJhc2UsICUgfAkwLjM3JQ0KICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uIHJhdGUgcGVyIGJhc2UgfAkwLjAxJQ0KICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRpb24gYXZlcmFnZSBsZW5ndGggfAkxLjYwDQogICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRpb24gcmF0ZSBwZXIgYmFzZSB8CTAuMDAlDQogICAgICAgICAgICAgICAgICAgICAgIEluc2VydGlvbiBhdmVyYWdlIGxlbmd0aCB8CTEuMzYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVVMVEktTUFQUElORyBSRUFEUzoNCiAgICAgICAgTnVtYmVyIG9mIHJlYWRzIG1hcHBlZCB0byBtdWx0aXBsZSBsb2NpIHwJMTgxNjI0NQ0KICAgICAgICAgICAgICUgb2YgcmVhZHMgbWFwcGVkIHRvIG11bHRpcGxlIGxvY2kgfAk2LjA0JQ0KICAgICAgICBOdW1iZXIgb2YgcmVhZHMgbWFwcGVkIHRvIHRvbyBtYW55IGxvY2kgfAk0NDg4Ng0KICAgICAgICAgICAgICUgb2YgcmVhZHMgbWFwcGVkIHRvIHRvbyBtYW55IGxvY2kgfAkwLjE1JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOTUFQUEVEIFJFQURTOg0KICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IHRvbyBtYW55IG1pc21hdGNoZXMgfAkwLjAwJQ0KICAgICAgICAgICAgICAgICAlIG9mIHJlYWRzIHVubWFwcGVkOiB0b28gc2hvcnQgfAkxMy4wMyUNCiAgICAgICAgICAgICAgICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IG90aGVyIHwJMC4xMyUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSElNRVJJQyBSRUFEUzoNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGNoaW1lcmljIHJlYWRzIHwJMA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgb2YgY2hpbWVyaWMgcmVhZHMgfAkwLjAwJQ0KDQoNCmBgYA0KDQoNCg0KDQoNCmBgYA0Kfi9yZXN1bHRzL3JuYXNlcS9Sbi9zdGFyX3JhdC90cmFuc2NyaXB0b21lT3V0JCBTVEFSIC0tcnVuVGhyZWFkTiAxMiAtLWdlbm9tZURpciB+L2dlbm9tZUFuZEluZGljZXMvUm4vc3Rhci8gLS1zamRiR1RGZmlsZSB+L2dlbm9tZUFuZEluZGljZXMvUm4vcm42LnJlZkdlbmUuZ3RmIC0tc2pkYk92ZXJoYW5nIDEwMCAtLXJlYWRGaWxlc0luIH4vZGF0YS9ybmFzZXEvUm4vUExvUy1PbmUtOC1lNTk1ODIvZjM0NF9wZmNfbmljb3RpbmUvU1JSODY5MDM0XzEuZmFzdHEuZ3ogfi9kYXRhL3JuYXNlcS9Sbi9QTG9TLU9uZS04LWU1OTU4Mi9mMzQ0X3BmY19uaWNvdGluZS9TUlI4NjkwMzRfMi5mYXN0cS5neiAtLXJlYWRGaWxlc0NvbW1hbmQgemNhdCAtLXF1YW50TW9kZSBUcmFuc2NyaXB0b21lU0FNIC0tb3V0RmlsZU5hbWVQcmVmaXggNmFsaWduLw0KDQpgYGANCg0KDQpBcHIgMTEgMTY6NDE6NDYgLi4uLi4gc3RhcnRlZCBTVEFSIHJ1bg0KDQpBcHIgMTEgMTY6NDE6NDYgLi4uLi4gbG9hZGluZyBnZW5vbWUNCg0KQXByIDExIDE2OjQyOjU0IC4uLi4uIHByb2Nlc3NpbmcgYW5ub3RhdGlvbnMgR1RGDQoNCkFwciAxMSAxNjo0Mjo1NSAuLi4uLiBpbnNlcnRpbmcganVuY3Rpb25zIGludG8gdGhlIGdlbm9tZSBpbmRpY2VzDQoNCkFwciAxMSAxNjo0NTowOCAuLi4uLiBzdGFydGVkIG1hcHBpbmcNCg0KQXByIDExIDE2OjQ4OjQ5IC4uLi4uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseQ0KDQoNCg0KDQoNCiMjIyMgJCBscyAtbCA2YWxpZ24vDQoNCi1ydy1ydy1yLS0gMSB1YnVudHUgdWJ1bnR1IDExNDUxOTE1ODI1IEFwciAxMSAxNjo0OCBBbGlnbmVkLm91dC5zYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgIDE3MTkxMzU0MjAgQXByIDExIDE2OjQ4IEFsaWduZWQudG9UcmFuc2NyaXB0b21lLm91dC5iYW0NCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgIDE4NjIgQXByIDExIDE2OjQ4IExvZy5maW5hbC5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAyOTEwMDYgQXByIDExIDE2OjQ4IExvZy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgICAgICA2MDAgQXByIDExIDE2OjQ4IExvZy5wcm9ncmVzcy5vdXQNCg0KLXJ3LXJ3LXItLSAxIHVidW50dSB1YnVudHUgICAgIDY4NDA0MzcgQXByIDExIDE2OjQ4IFNKLm91dC50YWINCg0KZHJ3eC0tLS0tLSAyIHVidW50dSB1YnVudHUgICAgICAgIDQwOTYgQXByIDExIDE2OjQyIF9TVEFSZ2Vub21lDQoNCg0KDQoNCiMjIyMgJCBjYXQgNmFsaWduL0xvZy5maW5hbC5vdXQgDQoNCg0KDQpgYGANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0ZWQgam9iIG9uIHwJQXByIDExIDE2OjQxOjQ2DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0ZWQgbWFwcGluZyBvbiB8CUFwciAxMSAxNjo0NTowOA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluaXNoZWQgb24gfAlBcHIgMTEgMTY6NDg6NDkNCiAgICAgICBNYXBwaW5nIHNwZWVkLCBNaWxsaW9uIG9mIHJlYWRzIHBlciBob3VyIHwJNDg1LjY3DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGlucHV0IHJlYWRzIHwJMjk4MTQ2ODcNCiAgICAgICAgICAgICAgICAgICAgICBBdmVyYWdlIGlucHV0IHJlYWQgbGVuZ3RoIHwJMTAwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTklRVUUgUkVBRFM6DQogICAgICAgICAgICAgICAgICAgVW5pcXVlbHkgbWFwcGVkIHJlYWRzIG51bWJlciB8CTI1MDI5NTgyDQogICAgICAgICAgICAgICAgICAgICAgICBVbmlxdWVseSBtYXBwZWQgcmVhZHMgJSB8CTgzLjk1JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBBdmVyYWdlIG1hcHBlZCBsZW5ndGggfAk5OS40MA0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogVG90YWwgfAk1NjY0ODAxDQogICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogQW5ub3RhdGVkIChzamRiKSB8CTUxNTIyMTcNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNwbGljZXM6IEdUL0FHIHwJNTU2MDI0Ng0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogR0MvQUcgfAk0NDU4OQ0KICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogQVQvQUMgfAk1NTA0DQogICAgICAgICAgICAgICBOdW1iZXIgb2Ygc3BsaWNlczogTm9uLWNhbm9uaWNhbCB8CTU0NDYyDQogICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2ggcmF0ZSBwZXIgYmFzZSwgJSB8CTAuMzglDQogICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRpb24gcmF0ZSBwZXIgYmFzZSB8CTAuMDElDQogICAgICAgICAgICAgICAgICAgICAgICBEZWxldGlvbiBhdmVyYWdlIGxlbmd0aCB8CTEuNjENCiAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydGlvbiByYXRlIHBlciBiYXNlIHwJMC4wMCUNCiAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0aW9uIGF2ZXJhZ2UgbGVuZ3RoIHwJMS4zNg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVUxUSS1NQVBQSU5HIFJFQURTOg0KICAgICAgICBOdW1iZXIgb2YgcmVhZHMgbWFwcGVkIHRvIG11bHRpcGxlIGxvY2kgfAkxODM0NzUzDQogICAgICAgICAgICAgJSBvZiByZWFkcyBtYXBwZWQgdG8gbXVsdGlwbGUgbG9jaSB8CTYuMTUlDQogICAgICAgIE51bWJlciBvZiByZWFkcyBtYXBwZWQgdG8gdG9vIG1hbnkgbG9jaSB8CTQwOTI0DQogICAgICAgICAgICAgJSBvZiByZWFkcyBtYXBwZWQgdG8gdG9vIG1hbnkgbG9jaSB8CTAuMTQlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5NQVBQRUQgUkVBRFM6DQogICAgICAgJSBvZiByZWFkcyB1bm1hcHBlZDogdG9vIG1hbnkgbWlzbWF0Y2hlcyB8CTAuMDAlDQogICAgICAgICAgICAgICAgICUgb2YgcmVhZHMgdW5tYXBwZWQ6IHRvbyBzaG9ydCB8CTkuNjMlDQogICAgICAgICAgICAgICAgICAgICAlIG9mIHJlYWRzIHVubWFwcGVkOiBvdGhlciB8CTAuMTMlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hJTUVSSUMgUkVBRFM6DQogICAgICAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBjaGltZXJpYyByZWFkcyB8CTANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIG9mIGNoaW1lcmljIHJlYWRzIHwJMC4wMCUNCg0KYGBgDQoNCg0KDQoNCg0KDQojIyA2LiBSU0VNIGFuYWx5c2lzDQoNCg0KIyMjIERvd25sb2FkIHRoZSBkYXRhDQoNCkJBTSBmaWxlcyB3ZXJlIGltcG9ydGVkIHRvIENlbnRPUyBhcyBkaXJlY3RvcmllcyAoMXMsIDJzLCAzcywgNHMsIDVzIGFuZCA2cykgZm9yIFJTRU0gYW5hbHlzaXMuIFRoZSBnZW5vbWUgYW5kIEdURiBmaWxlcyBhcmUgd2VyZSBhbHNvIGltcG9ydGVkICgmIGFsc28gcmVuYW1lZCkuDQoNCg0KIyMjIyAgJCBscyAtbA0KDQoNCmRyd3hyLXhyLXguIDIgYmRhc2ggYmRhc2ggICAgICAgICA0NSBBcHIgMTEgMjA6MTcgMXMNCg0KZHJ3eHIteHIteC4gMiBiZGFzaCBiZGFzaCAgICAgICAgIDQ1IEFwciAxMSAxODoyMSAycw0KDQpkcnd4ci14ci14LiAyIGJkYXNoIGJkYXNoICAgICAgICAgNDUgQXByIDExIDIwOjIwIDNzDQoNCmRyd3hyLXhyLXguIDIgYmRhc2ggYmRhc2ggICAgICAgICA0NSBBcHIgMTEgMjA6MjEgNHMNCg0KZHJ3eHIteHIteC4gMiBiZGFzaCBiZGFzaCAgICAgICAgIDQ1IEFwciAxMSAyMDoyNyA1cw0KDQpkcnd4ci14ci14LiAyIGJkYXNoIGJkYXNoICAgICAgICAgNDUgQXByIDExIDIwOjI3IDZzDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggMjkyNzYwNzMzMyBBcHIgIDkgMTU6MjYgcm42LmZhDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgICA0MDY1NCBBcHIgIDkgMTU6MjYgcm42LmZhLmZhaQ0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgNjE4OTEzNDEgQXByICA5IDE1OjI3IHJuNi5yZWZHZW5lLmd0Zg0KDQoNCg0KIyMjIFByZXBhcmUgUlNFTSByZWZlcmVuY2UgKHdpbGwgdXNlIGJvdGggdGhlIGZhIGFuZCBndGYgZmlsZSkNCg0KDQojIyMjIG1rZGlyIHJzZW1fcmVmDQoNCiMjIyMgY2QgcnNlbV9yZWYNCg0KIyMjIyByc2VtX3JlZiQgcnNlbS1wcmVwYXJlLXJlZmVyZW5jZSAtLWd0ZiBybjYucmVmR2VuZS5ndGYgcm42LmZhIC4vcnNlbVJlZg0KDQoNCmBgYA0KDQpyc2VtLWV4dHJhY3QtcmVmZXJlbmNlLXRyYW5zY3JpcHRzIC4vcnNlbVJlZiAwIHJuNi5yZWZHZW5lLmd0ZiBOb25lIDAgcm42LmZhDQoNClBhcnNlZCAyMDAwMDAgbGluZXMNCg0KUGFyc2luZyBndGYgRmlsZSBpcyBkb25lIQ0KDQpybjYuZmEgaXMgcHJvY2Vzc2VkIQ0KDQoxODkzOSB0cmFuc2NyaXB0cyBhcmUgZXh0cmFjdGVkIGFuZCAwIHRyYW5zY3JpcHRzIGFyZSBvbWl0dGVkLg0KDQpFeHRyYWN0aW5nIHNlcXVlbmNlcyBpcyBkb25lIQ0KDQpHcm91cCBGaWxlIGlzIGdlbmVyYXRlZCENCg0KVHJhbnNjcmlwdCBJbmZvcm1hdGlvbiBGaWxlIGlzIGdlbmVyYXRlZCENCg0KQ2hyb21vc29tZSBMaXN0IEZpbGUgaXMgZ2VuZXJhdGVkIQ0KDQpFeHRyYWN0ZWQgU2VxdWVuY2VzIEZpbGUgaXMgZ2VuZXJhdGVkIQ0KDQpyc2VtLXByZXJlZiAuL3JzZW1SZWYudHJhbnNjcmlwdHMuZmEgMSAuL3JzZW1SZWYNCg0KUmVmcy5tYWtlUmVmcyBmaW5pc2hlZCENCg0KUmVmcy5zYXZlUmVmcyBmaW5pc2hlZCENCg0KLi9yc2VtUmVmLmlkeC5mYSBpcyBnZW5lcmF0ZWQhDQoNCi4vcnNlbVJlZi5uMmcuaWR4LmZhIGlzIGdlbmVyYXRlZCENCg0KYGBgDQoNCg0KIyMjIyBzdGFyLXRyYW5zY3JpcHRvbWVvdXQkIGxzIC1sIHJzZW1fcmVmLw0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgICAxMjkzIEFwciAxMSAyMTowNiByc2VtUmVmLmNocmxpc3QNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICA5MzcxOCBBcHIgMTEgMjE6MDYgcnNlbVJlZi5ncnANCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCA0MzAwNzI4OSBBcHIgMTEgMjE6MDYgcnNlbVJlZi5pZHguZmENCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCA0MzAwNzI4OSBBcHIgMTEgMjE6MDYgcnNlbVJlZi5uMmcuaWR4LmZhDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggNDU4NTg0MTIgQXByIDExIDIxOjA2IHJzZW1SZWYuc2VxDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggIDYwNDExMDggQXByIDExIDIxOjA2IHJzZW1SZWYudGkNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCA0MzAwNzI4OSBBcHIgMTEgMjE6MDYgcnNlbVJlZi50cmFuc2NyaXB0cy5mYQ0KDQoNCg0KIyMjIFJTRU0tY2FsY3VsYXRlLWV4cHJlc3Npb24NCg0KDQojIyMjIHN0YXItdHJhbnNjcmlwdG9tZW91dCQgcnNlbS1jYWxjdWxhdGUtZXhwcmVzc2lvbiAtLWJhbSAtLW5vLWJhbS1vdXRwdXQgLXAgMTIgLS1wYWlyZWQtZW5kIC0tZm9yd2FyZC1wcm9iIDAgMXMvQWxpZ25lZC50b1RyYW5zY3JpcHRvbWUub3V0LmJhbSByc2VtX3JlZi9yc2VtUmVmIDFvdXQvID4mIHJzZW0xLmxvZw0KDQoNCiMjIyMgUmVwZWF0IGl0IGZvciB0aGUgcmVzdCBvZiB0aGUgYmFtIGZpbGVzDQoNCg0KDQoNCg0KIyMjIyAgIHN0YXItdHJhbnNjcmlwdG9tZW91dCQgbHMgLWwNCg0KZHJ3eHJ3eHIteC4gMyBiZGFzaCBiZGFzaCAgICAgICAgIDY2IEFwciAxMSAyMjo0MSAxb3V0DQoNCmRyd3hyd3hyLXguIDMgYmRhc2ggYmRhc2ggICAgICAgICA2NiBBcHIgMTEgMjM6NTYgMm91dA0KDQpkcnd4cnd4ci14LiAzIGJkYXNoIGJkYXNoICAgICAgICAgNjYgQXByIDEyIDAzOjQ4IDNvdXQNCg0KZHJ3eHJ3eHIteC4gMyBiZGFzaCBiZGFzaCAgICAgICAgIDY2IEFwciAxMiAwMzoxMyA0b3V0DQoNCmRyd3hyd3hyLXguIDMgYmRhc2ggYmRhc2ggICAgICAgICA2NiBBcHIgMTIgMDI6NDggNW91dA0KDQpkcnd4cnd4ci14LiAzIGJkYXNoIGJkYXNoICAgICAgICAgNjYgQXByIDEyIDAxOjU0IDZvdXQNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgMzA5MTQxIEFwciAxMSAyMjo0MSByc2VtMS5sb2cNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgMzUzODU1IEFwciAxMSAyMzo1NiByc2VtMi5sb2cNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgMjU1NTg4IEFwciAxMiAwMzo0OCByc2VtMy5sb2cNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgMzI2NjYyIEFwciAxMiAwMzoxMyByc2VtNC5sb2cNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgMzY2NDcyIEFwciAxMiAwMjo0OCByc2VtNS5sb2cNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgMjk0NDAyIEFwciAxMiAwMTo1NCByc2VtNi5sb2cNCg0KZHJ3eHJ3eHIteC4gMiBiZGFzaCBiZGFzaCAgICAgICAgMTYzIEFwciAxMSAyMToyMCByc2VtX3JlZg0KDQoNCg0KDQojIyA3LiBlZGdlUiAoRW1waXJpY2FsIEFuYWx5c2lzIG9mIERpZ2l0YWwgR2VuZSBFeHByZXNzaW9uKSBhbmFseXNpcyBvZiBpc29mb3Jtcw0KDQoNCiMjIyBHZW5lcmF0ZSBhIG1hdHJpeCBmaWxlIG9mIHRoZSBpc29mb3JtcyBmb3IgYW5hbHlzaXMgdXNpbmcgZWRnZVIgbWV0aG9kDQoNCg0KYGBgDQpzdGFyLXRyYW5zY3JpcHRvbWVvdXQkIGFidW5kYW5jZV9lc3RpbWF0ZXNfdG9fbWF0cml4LnBsIA0KDQotLWVzdF9tZXRob2QgUlNFTSANCg0KDQoxb3V0Ly5pc29mb3Jtcy5yZXN1bHRzIA0KMm91dC8uaXNvZm9ybXMucmVzdWx0cyANCjNvdXQvLmlzb2Zvcm1zLnJlc3VsdHMgDQo0b3V0Ly5pc29mb3Jtcy5yZXN1bHRzIA0KNW91dC8uaXNvZm9ybXMucmVzdWx0cyANCjZvdXQvLmlzb2Zvcm1zLnJlc3VsdHMgDQoNCi0tZ2VuZV90cmFuc19tYXAgbm9uZSANCg0KLS1uYW1lX3NhbXBsZV9ieV9iYXNlZGlyIA0KDQotLW91dF9wcmVmaXggaXNvZm9ybXNfZ2VuZV90cmFuc19tYXBfbm9uZS9pc29mb3Jtcw0KDQpgYGANCg0KDQotcmVhZGluZyBmaWxlOiAxb3V0Ly5pc29mb3Jtcy5yZXN1bHRzDQoNCi1yZWFkaW5nIGZpbGU6IDJvdXQvLmlzb2Zvcm1zLnJlc3VsdHMNCg0KLXJlYWRpbmcgZmlsZTogM291dC8uaXNvZm9ybXMucmVzdWx0cw0KDQotcmVhZGluZyBmaWxlOiA0b3V0Ly5pc29mb3Jtcy5yZXN1bHRzDQoNCi1yZWFkaW5nIGZpbGU6IDVvdXQvLmlzb2Zvcm1zLnJlc3VsdHMNCg0KLXJlYWRpbmcgZmlsZTogNm91dC8uaXNvZm9ybXMucmVzdWx0cw0KDQoNCiogT3V0cHV0dGluZyBjb21iaW5lZCBtYXRyaXguDQoNCi9ob21lL2JkYXNoL21pbmljb25kYTIvb3B0L3RyaW5pdHktMi42LjYvdXRpbC9zdXBwb3J0X3NjcmlwdHMvcnVuX1RNTV9zY2FsZV9tYXRyaXgucGwgDQoNCi0tbWF0cml4IGlzb2Zvcm1zX2dlbmVfdHJhbnNfbWFwX25vbmUvaXNvZm9ybXMuaXNvZm9ybS5UUE0ubm90X2Nyb3NzX25vcm0gPg0KDQppc29mb3Jtc19nZW5lX3RyYW5zX21hcF9ub25lL2lzb2Zvcm1zLmlzb2Zvcm0uVE1NLkVYUFIubWF0cml4DQoNCg0KDQpDTUQ6IFIgLS1uby1zYXZlIC0tbm8tcmVzdG9yZSAtLW5vLXNpdGUtZmlsZSAtLW5vLWluaXQtZmlsZSAtcSA8DQoNCmlzb2Zvcm1zX2dlbmVfdHJhbnNfbWFwX25vbmUvaXNvZm9ybXMuaXNvZm9ybS5UUE0ubm90X2Nyb3NzX25vcm0ucnVuVE1NLlIgMT4mMiANCg0KDQpgYGANCj4gbGlicmFyeShlZGdlUikNCg0KTG9hZGluZyByZXF1aXJlZCBwYWNrYWdlOiBsaW1tYQ0KDQo+IA0KDQo+IHJuYXNlcU1hdHJpeCA9IHJlYWQudGFibGUoImlzb2Zvcm1zX2dlbmVfdHJhbnNfbWFwX25vbmUvaXNvZm9ybXMuaXNvZm9ybS5UUE0ubm90X2Nyb3NzX25vcm0iLCBoZWFkZXI9VCwgcm93Lm5hbWVzPTEsIGNvbT0nJywgY2hlY2submFtZXM9RikNCg0KPiBybmFzZXFNYXRyaXggPSBhcy5tYXRyaXgocm5hc2VxTWF0cml4KQ0KDQo+IHJuYXNlcU1hdHJpeCA9IHJvdW5kKHJuYXNlcU1hdHJpeCkNCg0KPiBleHBfc3R1ZHkgPSBER0VMaXN0KGNvdW50cz1ybmFzZXFNYXRyaXgsIGdyb3VwPWZhY3Rvcihjb2xuYW1lcyhybmFzZXFNYXRyaXgpKSkNCg0KPiBleHBfc3R1ZHkgPSBjYWxjTm9ybUZhY3RvcnMoZXhwX3N0dWR5KQ0KDQo+IGV4cF9zdHVkeSRzYW1wbGVzJGVmZi5saWIuc2l6ZSA9IGV4cF9zdHVkeSRzYW1wbGVzJGxpYi5zaXplICogZXhwX3N0dWR5JHNhbXBsZXMkbm9ybS5mYWN0b3JzDQoNCj4gd3JpdGUudGFibGUoZXhwX3N0dWR5JHNhbXBsZXMsIGZpbGU9Imlzb2Zvcm1zX2dlbmVfdHJhbnNfbWFwX25vbmUvaXNvZm9ybXMuaXNvZm9ybS5UUE0ubm90X2Nyb3NzX25vcm0uVE1NX2luZm8udHh0IiwgcXVvdGU9Riwgc2VwPSJcdCIsIHJvdy5uYW1lcz1GKQ0KDQpgYGANCg0KDQojIyMjIHN0YXItdHJhbnNjcmlwdG9tZW91dCQgbHMgLWwgaXNvZm9ybXNfZ2VuZV90cmFuc19tYXBfbm9uZS8NCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCA5MzQ5MTcgQXByIDEyIDEyOjEyIGlzb2Zvcm1zLmlzb2Zvcm0uY291bnRzLm1hdHJpeA0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoIDk4MTg1NCBBcHIgMTIgMTI6MTIgaXNvZm9ybXMuaXNvZm9ybS5UTU0uRVhQUi5tYXRyaXgNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCA3NzUyODggQXByIDEyIDEyOjEyIGlzb2Zvcm1zLmlzb2Zvcm0uVFBNLm5vdF9jcm9zc19ub3JtDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgNTkwIEFwciAxMiAxMjoxMiBpc29mb3Jtcy5pc29mb3JtLlRQTS5ub3RfY3Jvc3Nfbm9ybS5ydW5UTU0uUg0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgIDMyMCBBcHIgMTIgMTI6MTIgaXNvZm9ybXMuaXNvZm9ybS5UUE0ubm90X2Nyb3NzX25vcm0uVE1NX2luZm8udHh0DQoNCg0KDQoNCg0KDQojIyMgUnVuIGRpZmZlcmVudGlhbCBhbmFseXNpcyAoREUpIGFuYWx5c2lzIHVzaW5nIG1ldGhvZCBlZGdlUjogUHJvZHVjZXMgTUEgcGxvdCBhbmQgdm9sY2FubyBwbG90DQoNCk5vdGU6IEFuYWx5c2lzIHdpdGggYmlvbG9naWNhbCB0cmlwbGljYXRlcyB3aXRoIHR3byBjb25kaXRpb25zIChjb25kaXRpb24gQT1zYWxpbmUgdHJlYXRtZW50IGFuZCBjb25kaXRpb24gQj1uaWNvdGluZSB0cmVhdG1lbnQpDQoNCkEgZmlsZSB3aXRoIHRoZSBuYW1lICJzYW1wbGVzX2Rlc2NyaWJlZC50eHQiIHdpbGwgYmUgbmVlZGVkIGZvciB0aGUgYW5hbHlzaXMuIEl0cyBjb250ZW50cyBhcmUgYXMgZm9sbG93czoNCg0KYGBgDQokIGNhdCBzYW1wbGVzX2Rlc2NyaWJlZC50eHQgDQoNCmNvbmRpdGlvbkEgICAxb3V0DQpjb25kaXRpb25BICAgMm91dA0KY29uZGl0aW9uQSAgIDNvdXQNCg0KDQpjb25kaXRpb25CICAgNG91dA0KY29uZGl0aW9uQiAgIDVvdXQNCmNvbmRpdGlvbkIgICA2b3V0DQoNCmBgYA0KDQoNCmBgYA0Kc3Rhci10cmFuc2NyaXB0b21lb3V0XSQgcnVuX0RFX2FuYWx5c2lzLnBsIA0KDQotLW1hdHJpeCBpc29mb3Jtc19nZW5lX3RyYW5zX21hcF9ub25lL2lzb2Zvcm1zLmlzb2Zvcm0uY291bnRzLm1hdHJpeCANCg0KLS1vdXRwdXQgaXNvZm9ybXNfREVfMy8gDQoNCi0tc2FtcGxlc19maWxlIHNhbXBsZXNfZGVzY3JpYmVkLnR4dCANCg0KLS1tZXRob2QgZWRnZVINCg0KYGBgDQoNCkdvdCA2IHNhbXBsZXMsIGFuZCBnb3Q6IDcgZGF0YSBmaWVsZHMuDQoNCkhlYWRlcjogMW91dAkyb3V0CTNvdXQJNG91dAk1b3V0CTZvdXQNCg0KTmV4dDogTk1fMDIxNjY2CTEzLjAwCTcuMDAJNi4wMAkxLjAwCTIuMDAJNC4wMA0KDQoNCg0KJFZBUjEgPSANCg0KICAgICAgICB7DQoNCiAgICAgICAgICAnMm91dCcgPT4gMiwNCiAgICAgICAgICANCiAgICAgICAgICAnMW91dCcgPT4gMSwNCiAgICAgICAgICANCiAgICAgICAgICAnNG91dCcgPT4gNCwNCiAgICAgICAgICANCiAgICAgICAgICAnNW91dCcgPT4gNSwNCiAgICAgICAgICANCiAgICAgICAgICAnM291dCcgPT4gMywNCiAgICAgICAgICANCiAgICAgICAgICAnNm91dCcgPT4gNg0KICAgICAgICAgIA0KICAgICAgICB9Ow0KICAgICAgICANCg0KJFZBUjEgPSANCg0KICAgICAgICB7DQogICAgICAgICAgDQogICAgICAgICAgJ2NvbmRpdGlvbkInID0+IFsNCiAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNG91dCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzVvdXQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc2b3V0Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgJ2NvbmRpdGlvbkEnID0+IFsNCiAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMW91dCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzJvdXQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICczb3V0Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBdDQogICAgICAgIH07DQogICAgICAgIA0KDQpDb250cmFzdHMgdG8gcGVyZm9ybSBhcmU6ICRWQVIxID0gDQoNCiAgICAgICAgWw0KDQogICAgICAgICAgWw0KICAgICAgICAgIA0KICAgICAgICAgICAgJ2NvbmRpdGlvbkEnLA0KICAgICAgICAgICAgDQogICAgICAgICAgICAnY29uZGl0aW9uQicNCiAgICAgICAgICAgIA0KICAgICAgICAgIF0NCiAgICAgICAgICANCiAgICAgICAgXTsNCiAgICAgICAgDQpDTUQ6IFIgLS1uby1zYXZlIC0tbm8tcmVzdG9yZSAtLW5vLXNpdGUtZmlsZSAtLW5vLWluaXQtZmlsZSAtcSA8IGlzb2Zvcm1zLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5jb25kaXRpb25BX3ZzX2NvbmRpdGlvbkIuY29uZGl0aW9uQS52cy5jb25kaXRpb25CLkVkZ2VSLlJzY3JpcHQNCg0KDQpgYGANCj4gbGlicmFyeShlZGdlUikNCg0KTG9hZGluZyByZXF1aXJlZCBwYWNrYWdlOiBsaW1tYQ0KDQo+IA0KPiBkYXRhID0gcmVhZC50YWJsZSgiL2hvbWUvYmRhc2gvRGVza3RvcC9zdGFyLXRyYW5zY3JpcHRvbWVvdXQvaXNvZm9ybXNfZ2VuZV90cmFuc19tYXBfbm9uZS9pc29mb3Jtcy5pc29mb3JtLmNvdW50cy5tYXRyaXgiLCBoZWFkZXI9VCwgcm93Lm5hbWVzPTEsIGNvbT0nJykNCg0KPiBjb2xfb3JkZXJpbmcgPSBjKDEsMiwzLDQsNSw2KQ0KDQo+IHJuYXNlcU1hdHJpeCA9IGRhdGFbLGNvbF9vcmRlcmluZ10NCg0KPiBybmFzZXFNYXRyaXggPSByb3VuZChybmFzZXFNYXRyaXgpDQoNCj4gcm5hc2VxTWF0cml4ID0gcm5hc2VxTWF0cml4W3Jvd1N1bXMoY3BtKHJuYXNlcU1hdHJpeCkgPiAxKSA+PSAyLF0NCg0KPiBjb25kaXRpb25zID0gZmFjdG9yKGMocmVwKCJjb25kaXRpb25BIiwgMyksIHJlcCgiY29uZGl0aW9uQiIsIDMpKSkNCj4gDQo+IGV4cF9zdHVkeSA9IERHRUxpc3QoY291bnRzPXJuYXNlcU1hdHJpeCwgZ3JvdXA9Y29uZGl0aW9ucykNCg0KPiBleHBfc3R1ZHkgPSBjYWxjTm9ybUZhY3RvcnMoZXhwX3N0dWR5KQ0KDQo+IGV4cF9zdHVkeSA9IGVzdGltYXRlQ29tbW9uRGlzcChleHBfc3R1ZHkpDQoNCj4gZXhwX3N0dWR5ID0gZXN0aW1hdGVUYWd3aXNlRGlzcChleHBfc3R1ZHkpDQoNCj4gZXQgPSBleGFjdFRlc3QoZXhwX3N0dWR5LCBwYWlyPWMoImNvbmRpdGlvbkEiLCAiY29uZGl0aW9uQiIpKQ0KDQo+IHRUYWdzID0gdG9wVGFncyhldCxuPU5VTEwpDQoNCj4gcmVzdWx0X3RhYmxlID0gdFRhZ3MkdGFibGUNCg0KPiByZXN1bHRfdGFibGUgPSBkYXRhLmZyYW1lKHNhbXBsZUE9ImNvbmRpdGlvbkEiLCBzYW1wbGVCPSJjb25kaXRpb25CIiwgcmVzdWx0X3RhYmxlKQ0KDQo+IHJlc3VsdF90YWJsZSRsb2dGQyA9IC0xICogcmVzdWx0X3RhYmxlJGxvZ0ZDDQoNCj4gd3JpdGUudGFibGUocmVzdWx0X3RhYmxlLCBmaWxlPSdpc29mb3Jtcy5pc29mb3JtLmNvdW50cy5tYXRyaXguY29uZGl0aW9uQV92c19jb25kaXRpb25CLmVkZ2VSLkRFX3Jlc3VsdHMnLCBzZXA9JwknLCBxdW90ZT1GLCByb3cubmFtZXM9VCkNCg0KPiB3cml0ZS50YWJsZShybmFzZXFNYXRyaXgsIGZpbGU9J2lzb2Zvcm1zLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5jb25kaXRpb25BX3ZzX2NvbmRpdGlvbkIuZWRnZVIuY291bnRfbWF0cml4Jywgc2VwPScJJywgcXVvdGU9Riwgcm93Lm5hbWVzPVQpDQoNCj4gc291cmNlKCIvaG9tZS9iZGFzaC9taW5pY29uZGEyL29wdC90cmluaXR5LTIuNi42L0FuYWx5c2lzL0RpZmZlcmVudGlhbEV4cHJlc3Npb24vUi9ybmFzZXFfcGxvdF9mdW5jcy5SIikNCg0KPiBwZGYoImlzb2Zvcm1zLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5jb25kaXRpb25BX3ZzX2NvbmRpdGlvbkIuZWRnZVIuREVfcmVzdWx0cy5NQV9uX1ZvbGNhbm8ucGRmIikNCg0KPiBwbG90X01BX2FuZF9Wb2xjYW5vKHJvd25hbWVzKHJlc3VsdF90YWJsZSksIHJlc3VsdF90YWJsZSRsb2dDUE0sIHJlc3VsdF90YWJsZSRsb2dGQywgcmVzdWx0X3RhYmxlJEZEUikNCg0KPiBkZXYub2ZmKCkNCg0KbnVsbCBkZXZpY2UgDQogICAgICAgICAgMSANCiAgICAgICAgICANCj4gDQoNCmBgYA0KDQoNCiMjIyMgc3Rhci10cmFuc2NyaXB0b21lb3V0XSQgbHMgLWwgaXNvZm9ybXNfREVfMy8NCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAxNDI1IEFwciAxMyAwMjoyNiBpc29mb3Jtcy5pc29mb3JtLmNvdW50cy5tYXRyaXguY29uZGl0aW9uQV92c19jb25kaXRpb25CLmNvbmRpdGlvbkEudnMuY29uZGl0aW9uQi5FZGdlUi5Sc2NyaXB0DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggIDQ0Nzk3NCBBcHIgMTMgMDI6MjcgaXNvZm9ybXMuaXNvZm9ybS5jb3VudHMubWF0cml4LmNvbmRpdGlvbkFfdnNfY29uZGl0aW9uQi5lZGdlUi5jb3VudF9tYXRyaXgNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAxMTU2Mjg3IEFwciAxMyAwMjoyNyBpc29mb3Jtcy5pc29mb3JtLmNvdW50cy5tYXRyaXguY29uZGl0aW9uQV92c19jb25kaXRpb25CLmVkZ2VSLkRFX3Jlc3VsdHMNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgMTE4MDY1IEFwciAxMyAwMjoyNyBpc29mb3Jtcy5pc29mb3JtLmNvdW50cy5tYXRyaXguY29uZGl0aW9uQV92c19jb25kaXRpb25CLmVkZ2VSLkRFX3Jlc3VsdHMuTUFfbl9Wb2xjYW5vLnBkZg0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgICA5NTkgQXByIDEzIDAyOjI5IGlzb2Zvcm1zLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5jb25kaXRpb25BX3ZzX2NvbmRpdGlvbkIuZWRnZVIuREVfcmVzdWx0cy5QMC4wMDFfQzIuY29uZGl0aW9uQS1VUC5zdWJzZXQNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgNTEzIEFwciAxMyAwMjoyOSBpc29mb3Jtcy5pc29mb3JtLmNvdW50cy5tYXRyaXguY29uZGl0aW9uQV92c19jb25kaXRpb25CLmVkZ2VSLkRFX3Jlc3VsdHMuUDAuMDAxX0MyLmNvbmRpdGlvbkItVVAuc3Vic2V0DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgMTQwMiBBcHIgMTMgMDI6MjkgaXNvZm9ybXMuaXNvZm9ybS5jb3VudHMubWF0cml4LmNvbmRpdGlvbkFfdnNfY29uZGl0aW9uQi5lZGdlUi5ERV9yZXN1bHRzLlAwLjAwMV9DMi5ERS5zdWJzZXQNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgIDk2IEFwciAxMyAwMjoyOSBpc29mb3Jtcy5pc29mb3JtLmNvdW50cy5tYXRyaXguY29uZGl0aW9uQV92c19jb25kaXRpb25CLmVkZ2VSLkRFX3Jlc3VsdHMuc2FtcGxlcw0KDQoNCiFbREVfaXNvZm9ybXMuTUFfcGxvdF0oaXNvZm9ybXNfREVfMy9jb25kQV92c19jb25kQl9NQXBsb3QuanBnKQ0KDQoNCg0KIVtERV9pc29mb3Jtcy52b2xjYW5vX3Bsb3RdKGlzb2Zvcm1zX0RFXzMvY29uZEFfdnNfY29uZEJfdm9sY2Fub3Bsb3QuanBnKQ0KDQoNCg0KDQoNCiMjIyMgc3Rhci10cmFuc2NyaXB0b21lb3V0JCBjZCBpc29mb3Jtc19ERV8zLw0KDQoNCg0KDQoNCg0KDQojIyMgQW5hbHl6ZSBkaWZmZXJlbnRpYWwgZXhwcmVzc2lvbjogUHJvZHVjZXMgaGVhdG1hcA0KDQoNCg0KDQpgYGANCmlzb2Zvcm1zX0RFXzMkIGFuYWx5emVfZGlmZl9leHByLnBsIA0KDQotLW1hdHJpeCAuLi9pc29mb3Jtc19nZW5lX3RyYW5zX21hcF9ub25lL2lzb2Zvcm1zLmlzb2Zvcm0uVE1NLkVYUFIubWF0cml4IA0KDQotLXNhbXBsZXMgLi4vc2FtcGxlc19kZXNjcmliZWQudHh0IA0KDQotLW91dHB1dCBERV9pc29mb3Jtc18zDQoNCmBgYA0KDQoNCioqRm91bmQgOSBmZWF0dXJlcyBhcyBkaWZmZXJlbnRpYWxseSBleHByZXNzZWQuKioNCg0KDQoNCkNNRDogDQoNCi9ob21lL2JkYXNoL21pbmljb25kYTIvb3B0L3RyaW5pdHktMi42LjYvQW5hbHlzaXMvRGlmZmVyZW50aWFsRXhwcmVzc2lvbi9QdFIgDQoNCi1tIERFX2lzb2Zvcm1zXzMubWF0cml4IA0KDQotLWxvZzIgDQoNCi0taGVhdG1hcCANCg0KLS1taW5fY29sU3VtcyAwIA0KDQotLW1pbl9yb3dTdW1zIDAgDQoNCi0tZ2VuZV9kaXN0IGV1Y2xpZGVhbiANCg0KLS1zYW1wbGVfZGlzdCBldWNsaWRlYW4gDQoNCi0tc2FtcGxlX2Nvcl9tYXRyaXggDQoNCi0tY2VudGVyX3Jvd3MgDQoNCi0tc2F2ZSAgDQoNCi1zIC4uL3NhbXBsZXNfZGVzY3JpYmVkLnR4dA0KDQoNCg0KQ01EOiANCg0KUiANCg0KLS1uby1zYXZlIA0KDQotLW5vLXJlc3RvcmUgDQoNCi0tbm8tc2l0ZS1maWxlIA0KDQotLW5vLWluaXQtZmlsZSANCg0KLXEgPCBERV9pc29mb3Jtc18zLm1hdHJpeC5SDQoNCg0KYGBgDQo+IGxpYnJhcnkoY2x1c3RlcikNCg0KPiBsaWJyYXJ5KEJpb2Jhc2UpDQoNCmBgYA0KDQpMb2FkaW5nIHJlcXVpcmVkIHBhY2thZ2U6IEJpb2NHZW5lcmljcw0KDQpMb2FkaW5nIHJlcXVpcmVkIHBhY2thZ2U6IHBhcmFsbGVsDQoNCkF0dGFjaGluZyBwYWNrYWdlOiDigJhCaW9jR2VuZXJpY3PigJkNCg0KVGhlIGZvbGxvd2luZyBvYmplY3RzIGFyZSBtYXNrZWQgZnJvbSDigJhwYWNrYWdlOnBhcmFsbGVs4oCZOg0KDQogICAgY2x1c3RlckFwcGx5LCBjbHVzdGVyQXBwbHlMQiwgY2x1c3RlckNhbGwsIGNsdXN0ZXJFdmFsUSwNCiAgICBjbHVzdGVyRXhwb3J0LCBjbHVzdGVyTWFwLCBwYXJBcHBseSwgcGFyQ2FwcGx5LCBwYXJMYXBwbHksDQogICAgcGFyTGFwcGx5TEIsIHBhclJhcHBseSwgcGFyU2FwcGx5LCBwYXJTYXBwbHlMQg0KDQpUaGUgZm9sbG93aW5nIG9iamVjdHMgYXJlIG1hc2tlZCBmcm9tIOKAmHBhY2thZ2U6c3RhdHPigJk6DQoNCiAgICBJUVIsIG1hZCwgc2QsIHZhciwgeHRhYnMNCg0KVGhlIGZvbGxvd2luZyBvYmplY3RzIGFyZSBtYXNrZWQgZnJvbSDigJhwYWNrYWdlOmJhc2XigJk6DQoNCiAgICBhbnlEdXBsaWNhdGVkLCBhcHBlbmQsIGFzLmRhdGEuZnJhbWUsIGJhc2VuYW1lLCBjYmluZCwgY29sTWVhbnMsDQogICAgY29sbmFtZXMsIGNvbFN1bXMsIGRpcm5hbWUsIGRvLmNhbGwsIGR1cGxpY2F0ZWQsIGV2YWwsIGV2YWxxLA0KICAgIEZpbHRlciwgRmluZCwgZ2V0LCBncmVwLCBncmVwbCwgaW50ZXJzZWN0LCBpcy51bnNvcnRlZCwgbGFwcGx5LA0KICAgIGxlbmd0aHMsIE1hcCwgbWFwcGx5LCBtYXRjaCwgbWdldCwgb3JkZXIsIHBhc3RlLCBwbWF4LCBwbWF4LmludCwNCiAgICBwbWluLCBwbWluLmludCwgUG9zaXRpb24sIHJhbmssIHJiaW5kLCBSZWR1Y2UsIHJvd01lYW5zLCByb3duYW1lcywNCiAgICByb3dTdW1zLCBzYXBwbHksIHNldGRpZmYsIHNvcnQsIHRhYmxlLCB0YXBwbHksIHVuaW9uLCB1bmlxdWUsDQogICAgdW5zcGxpdCwgd2hpY2gsIHdoaWNoLm1heCwgd2hpY2gubWluDQoNCldlbGNvbWUgdG8gQmlvY29uZHVjdG9yDQoNCiAgICBWaWduZXR0ZXMgY29udGFpbiBpbnRyb2R1Y3RvcnkgbWF0ZXJpYWw7IHZpZXcgd2l0aA0KICAgICdicm93c2VWaWduZXR0ZXMoKScuIFRvIGNpdGUgQmlvY29uZHVjdG9yLCBzZWUNCiAgICAnY2l0YXRpb24oIkJpb2Jhc2UiKScsIGFuZCBmb3IgcGFja2FnZXMgJ2NpdGF0aW9uKCJwa2duYW1lIiknLg0KICAgIA0KYGBgDQo+IGxpYnJhcnkocXZhbHVlKQ0KDQo+IGxpYnJhcnkoZmFzdGNsdXN0ZXIpDQoNCmBgYA0KDQoNCkF0dGFjaGluZyBwYWNrYWdlOiDigJhmYXN0Y2x1c3RlcuKAmQ0KDQpUaGUgZm9sbG93aW5nIG9iamVjdCBpcyBtYXNrZWQgZnJvbSDigJhwYWNrYWdlOnN0YXRz4oCZOg0KDQogICAgaGNsdXN0DQogICAgDQogICAgDQpgYGANCj4gb3B0aW9ucyhzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQoNCj4gTk9fUkVVU0UgPSBGDQoNCj4gDQoNCj4gIyB0cnkgdG8gcmV1c2UgZWFybGllci1sb2FkZWQgZGF0YSBpZiBwb3NzaWJsZQ0KDQo+IGlmIChmaWxlLmV4aXN0cygiREVfaXNvZm9ybXNfMy5tYXRyaXguUkRhdGEiKSAmJiAhIE5PX1JFVVNFKSB7DQorICAgICBwcmludCgnUkVTVE9SSU5HIERBVEEgRlJPTSBFQVJMSUVSIEFOQUxZU0lTJykNCisgICAgIGxvYWQoIkRFX2lzb2Zvcm1zXzMubWF0cml4LlJEYXRhIikNCisgfSBlbHNlIHsNCisgICAgIHByaW50KCdSZWFkaW5nIG1hdHJpeCBmaWxlLicpDQorICAgICBwcmltYXJ5X2RhdGEgPSByZWFkLnRhYmxlKCJERV9pc29mb3Jtc18zLm1hdHJpeCIsIGhlYWRlcj1ULCBjb209JycsIHJvdy5uYW1lcz0xLCBjaGVjay5uYW1lcz1GKQ0KKyAgICAgcHJpbWFyeV9kYXRhID0gYXMubWF0cml4KHByaW1hcnlfZGF0YSkNCisgfQ0KDQpbMV0gIlJlYWRpbmcgbWF0cml4IGZpbGUuIg0KDQo+IHNvdXJjZSgiL2hvbWUvYmRhc2gvbWluaWNvbmRhMi9vcHQvdHJpbml0eS0yLjYuNi9BbmFseXNpcy9EaWZmZXJlbnRpYWxFeHByZXNzaW9uL1IvaGVhdG1hcC4zLlIiKQ0KDQo+IHNvdXJjZSgiL2hvbWUvYmRhc2gvbWluaWNvbmRhMi9vcHQvdHJpbml0eS0yLjYuNi9BbmFseXNpcy9EaWZmZXJlbnRpYWxFeHByZXNzaW9uL1IvbWlzY19ybmFzZXFfZnVuY3MuUiIpDQoNCj4gc291cmNlKCIvaG9tZS9iZGFzaC9taW5pY29uZGEyL29wdC90cmluaXR5LTIuNi42L0FuYWx5c2lzL0RpZmZlcmVudGlhbEV4cHJlc3Npb24vUi9wYWlyczMuUiIpDQoNCj4gc291cmNlKCIvaG9tZS9iZGFzaC9taW5pY29uZGEyL29wdC90cmluaXR5LTIuNi42L0FuYWx5c2lzL0RpZmZlcmVudGlhbEV4cHJlc3Npb24vUi92aW9wbG90Mi5SIikNCg0KPiBkYXRhID0gcHJpbWFyeV9kYXRhDQoNCj4gbXloZWF0Y29sID0gY29sb3JwYW5lbCg3NSwgJ3B1cnBsZScsJ2JsYWNrJywneWVsbG93JykNCg0KPiBzYW1wbGVzX2RhdGEgPSByZWFkLnRhYmxlKCIuLi9zYW1wbGVzX2Rlc2NyaWJlZC50eHQiLCBoZWFkZXI9RiwgY2hlY2submFtZXM9RiwgZmlsbD1UKQ0KDQo+IHNhbXBsZXNfZGF0YSA9IHNhbXBsZXNfZGF0YVtzYW1wbGVzX2RhdGFbLDJdICE9ICcnLF0NCg0KPiBjb2xuYW1lcyhzYW1wbGVzX2RhdGEpID0gYygnc2FtcGxlX25hbWUnLCAncmVwbGljYXRlX25hbWUnKQ0KDQo+IHNhbXBsZV90eXBlcyA9IGFzLmNoYXJhY3Rlcih1bmlxdWUoc2FtcGxlc19kYXRhWywxXSkpDQoNCj4gcmVwX25hbWVzID0gYXMuY2hhcmFjdGVyKHNhbXBsZXNfZGF0YVssMl0pDQoNCj4gZGF0YSA9IGRhdGFbLCBjb2xuYW1lcyhkYXRhKSAlaW4lIHJlcF9uYW1lcywgZHJvcD1GIF0NCg0KPiBuc2FtcGxlcyA9IGxlbmd0aChzYW1wbGVfdHlwZXMpDQoNCj4gc2FtcGxlX2NvbG9ycyA9IHJhaW5ib3cobnNhbXBsZXMpDQoNCj4gbmFtZXMoc2FtcGxlX2NvbG9ycykgPSBzYW1wbGVfdHlwZXMNCg0KPiBzYW1wbGVfdHlwZV9saXN0ID0gbGlzdCgpDQoNCj4gZm9yIChpIGluIDE6bnNhbXBsZXMpIHsNCisgICAgIHNhbXBsZXNfd2FudCA9IHNhbXBsZXNfZGF0YVtzYW1wbGVzX2RhdGFbLDFdPT1zYW1wbGVfdHlwZXNbaV0sIDJdDQorICAgICBzYW1wbGVfdHlwZV9saXN0W1tzYW1wbGVfdHlwZXNbaV1dXSA9IGFzLnZlY3RvcihzYW1wbGVzX3dhbnQpDQorIH0NCg0KPiBzYW1wbGVfZmFjdG9yaW5nID0gY29sbmFtZXMoZGF0YSkNCg0KPiBmb3IgKGkgaW4gMTpuc2FtcGxlcykgew0KKyAgICAgc2FtcGxlX3R5cGUgPSBzYW1wbGVfdHlwZXNbaV0NCisgICAgIHJlcGxpY2F0ZXNfd2FudCA9IHNhbXBsZV90eXBlX2xpc3RbW3NhbXBsZV90eXBlXV0NCisgICAgIHNhbXBsZV9mYWN0b3JpbmdbIGNvbG5hbWVzKGRhdGEpICVpbiUgcmVwbGljYXRlc193YW50IF0gPSBzYW1wbGVfdHlwZQ0KKyB9DQoNCj4gaW5pdGlhbF9tYXRyaXggPSBkYXRhICMgc3RvcmUgYmVmb3JlIGRvaW5nIHZhcmlvdXMgZGF0YSB0cmFuc2Zvcm1hdGlvbnMNCg0KPiBkYXRhID0gbG9nMihkYXRhKzEpDQoNCj4gc2FtcGxlX2ZhY3RvcmluZyA9IGNvbG5hbWVzKGRhdGEpDQoNCj4gZm9yIChpIGluIDE6bnNhbXBsZXMpIHsNCisgICAgIHNhbXBsZV90eXBlID0gc2FtcGxlX3R5cGVzW2ldDQorICAgICByZXBsaWNhdGVzX3dhbnQgPSBzYW1wbGVfdHlwZV9saXN0W1tzYW1wbGVfdHlwZV1dDQorICAgICBzYW1wbGVfZmFjdG9yaW5nWyBjb2xuYW1lcyhkYXRhKSAlaW4lIHJlcGxpY2F0ZXNfd2FudCBdID0gc2FtcGxlX3R5cGUNCisgfQ0KDQo+IHNhbXBsZUFubm90YXRpb25zID0gbWF0cml4KG5jb2w9bmNvbChkYXRhKSxucm93PW5zYW1wbGVzKQ0KDQo+IGZvciAoaSBpbiAxOm5zYW1wbGVzKSB7DQorICAgc2FtcGxlQW5ub3RhdGlvbnNbaSxdID0gY29sbmFtZXMoZGF0YSkgJWluJSBzYW1wbGVfdHlwZV9saXN0W1tzYW1wbGVfdHlwZXNbaV1dXQ0KKyB9DQoNCj4gc2FtcGxlQW5ub3RhdGlvbnMgPSBhcHBseShzYW1wbGVBbm5vdGF0aW9ucywgMToyLCBmdW5jdGlvbih4KSBhcy5sb2dpY2FsKHgpKQ0KDQo+IHNhbXBsZUFubm90YXRpb25zID0gc2FtcGxlX21hdHJpeF90b19jb2xvcl9hc3NpZ25tZW50cyhzYW1wbGVBbm5vdGF0aW9ucywgY29sPXNhbXBsZV9jb2xvcnMpDQoNCj4gcm93bmFtZXMoc2FtcGxlQW5ub3RhdGlvbnMpID0gYXMudmVjdG9yKHNhbXBsZV90eXBlcykNCg0KPiBjb2xuYW1lcyhzYW1wbGVBbm5vdGF0aW9ucykgPSBjb2xuYW1lcyhkYXRhKQ0KDQo+IGRhdGEgPSBhcy5tYXRyaXgoZGF0YSkgIyBjb252ZXJ0IHRvIG1hdHJpeA0KDQo+IA0KPiAjIENlbnRlcmluZyByb3dzDQoNCj4gZGF0YSA9IHQoc2NhbGUodChkYXRhKSwgc2NhbGU9RikpDQo+IA0KDQo+IHdyaXRlLnRhYmxlKGRhdGEsIGZpbGU9IkRFX2lzb2Zvcm1zXzMubWF0cml4LmxvZzIuY2VudGVyZWQuZGF0IiwgcXVvdGU9Riwgc2VwPScJJyk7DQoNCj4gaWYgKG5yb3coZGF0YSkgPCAyKSB7IHN0b3AoIg0KKyANCisgKioqKiBTb3JyeSwgYXQgbGVhc3QgdHdvIHJvd3MgYXJlIHJlcXVpcmVkIGZvciB0aGlzIG1hdHJpeC4NCisgDQorICIpO30NCg0KDQo+IGlmIChuY29sKGRhdGEpIDwgMikgeyBzdG9wKCINCisgDQorICoqKiogU29ycnksIGF0IGxlYXN0IHR3byBjb2x1bW5zIGFyZSByZXF1aXJlZCBmb3IgdGhpcyBtYXRyaXguDQorIA0KKyAiKTt9DQoNCj4gc2FtcGxlX2NvciA9IGNvcihkYXRhLCBtZXRob2Q9J3BlYXJzb24nLCB1c2U9J3BhaXJ3aXNlLmNvbXBsZXRlLm9icycpDQoNCj4gd3JpdGUudGFibGUoc2FtcGxlX2NvciwgZmlsZT0iREVfaXNvZm9ybXNfMy5tYXRyaXgubG9nMi5jZW50ZXJlZC5zYW1wbGVfY29yLmRhdCIsIHF1b3RlPUYsIHNlcD0nCScpDQoNCj4gc2FtcGxlX2Rpc3QgPSBkaXN0KHQoZGF0YSksIG1ldGhvZD0nZXVjbGlkZWFuJykNCg0KPiBoY19zYW1wbGVzID0gaGNsdXN0KHNhbXBsZV9kaXN0LCBtZXRob2Q9J2NvbXBsZXRlJykNCg0KPiBwZGYoIkRFX2lzb2Zvcm1zXzMubWF0cml4LmxvZzIuY2VudGVyZWQuc2FtcGxlX2Nvcl9tYXRyaXgucGRmIikNCg0KPiBzYW1wbGVfY29yX2Zvcl9wbG90ID0gc2FtcGxlX2Nvcg0KDQo+IGhlYXRtYXAuMyhzYW1wbGVfY29yX2Zvcl9wbG90LCBkZW5kcm9ncmFtPSdib3RoJywgUm93dj1hcy5kZW5kcm9ncmFtKGhjX3NhbXBsZXMpLCBDb2x2PWFzLmRlbmRyb2dyYW0oaGNfc2FtcGxlcyksIGNvbCA9IG15aGVhdGNvbCwgc2NhbGU9J25vbmUnLCBzeW1tPVRSVUUsIGtleT1UUlVFLGRlbnNpdHkuaW5mbz0nbm9uZScsIHRyYWNlPSdub25lJywgc3lta2V5PUZBTFNFLCBzeW1icmVha3M9RiwgbWFyZ2lucz1jKDEwLDEwKSwgY2V4Q29sPTEsIGNleFJvdz0xLCBjZXgubWFpbj0wLjc1LCBtYWluPXBhc3RlKCJzYW1wbGUgY29ycmVsYXRpb24gbWF0cml4DQorICIsICJERV9pc29mb3Jtc18zLm1hdHJpeC5sb2cyLmNlbnRlcmVkIikgLCBDb2xTaWRlQ29sb3JzPXNhbXBsZUFubm90YXRpb25zLCBSb3dTaWRlQ29sb3JzPXQoc2FtcGxlQW5ub3RhdGlvbnMpKQ0KZm9yIHBsb3R0aW5nOjogbWluLnJhdzogLTAuOTU5ODA3NzI3NjI4NzA2IG1heC5yYXc6IDENCg0KPiBkZXYub2ZmKCkNCg0KbnVsbCBkZXZpY2UgDQogICAgICAgICAgMSANCiAgICAgICAgICANCj4gZ2VuZV9jb3IgPSBOVUxMDQoNCj4gZ2VuZV9kaXN0ID0gZGlzdChkYXRhLCBtZXRob2Q9J2V1Y2xpZGVhbicpDQoNCj4gaWYgKG5yb3coZGF0YSkgPD0gMSkgeyBtZXNzYWdlKCdUb28gZmV3IGdlbmVzIHRvIGdlbmVyYXRlIGhlYXRtYXAnKTsgcXVpdChzdGF0dXM9MCk7IH0NCg0KPiBoY19nZW5lcyA9IGhjbHVzdChnZW5lX2Rpc3QsIG1ldGhvZD0nY29tcGxldGUnKQ0KDQo+IGhlYXRtYXBfZGF0YSA9IGRhdGENCg0KPiBwZGYoIkRFX2lzb2Zvcm1zXzMubWF0cml4LmxvZzIuY2VudGVyZWQuZ2VuZXNfdnNfc2FtcGxlc19oZWF0bWFwLnBkZiIpDQoNCj4gaGVhdG1hcC4zKGhlYXRtYXBfZGF0YSwgZGVuZHJvZ3JhbT0nYm90aCcsIFJvd3Y9YXMuZGVuZHJvZ3JhbShoY19nZW5lcyksIENvbHY9YXMuZGVuZHJvZ3JhbShoY19zYW1wbGVzKSwgY29sPW15aGVhdGNvbCwgc2NhbGU9Im5vbmUiLCBkZW5zaXR5LmluZm89Im5vbmUiLCB0cmFjZT0ibm9uZSIsIGtleT1UUlVFLCBrZXlzaXplPTEuMiwgY2V4Q29sPTEsIG1hcmdpbnM9YygxMCwxMCksIGNleC5tYWluPTAuNzUsIG1haW49cGFzdGUoInNhbXBsZXMgdnMuIGZlYXR1cmVzDQorICIsICJERV9pc29mb3Jtc18zLm1hdHJpeC5sb2cyLmNlbnRlcmVkIiApICwgQ29sU2lkZUNvbG9ycz1zYW1wbGVBbm5vdGF0aW9ucykNCmZvciBwbG90dGluZzo6IG1pbi5yYXc6IC01LjE1NzYwNjU4NDEzNDEgbWF4LnJhdzogNS4xNTc2MDY1ODQxMzQxDQoNCj4gZGV2Lm9mZigpDQoNCm51bGwgZGV2aWNlIA0KICAgICAgICAgIDEgDQo+IHNhdmUobGlzdD1scyhhbGw9VFJVRSksIGZpbGU9IkRFX2lzb2Zvcm1zXzMubWF0cml4LlJEYXRhIikNCg0KPiANCg0KYGBgDQoNCg0KDQoNCiMjIyMgc3Rhci10cmFuc2NyaXB0b21lb3V0XSQgbHMgLWwgaXNvZm9ybXNfREVfMy8NCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgIDUzIEFwciAxMyAwMjoyOSBERV9mZWF0dXJlX2NvdW50cy5QMC4wMDFfQzIubWF0cml4DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgIDQ3NiBBcHIgMTMgMDI6MjkgREVfaXNvZm9ybXNfMy5tYXRyaXgNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAxMTA0IEFwciAxMyAwMjoyOSBERV9pc29mb3Jtc18zLm1hdHJpeC5sb2cyLmNlbnRlcmVkLmRhdA0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgIDY1MjYgQXByIDEzIDAyOjI5IERFX2lzb2Zvcm1zXzMubWF0cml4LmxvZzIuY2VudGVyZWQuZ2VuZXNfdnNfc2FtcGxlc19oZWF0bWFwLnBkZg0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgICA2MzQgQXByIDEzIDAyOjI5IERFX2lzb2Zvcm1zXzMubWF0cml4LmxvZzIuY2VudGVyZWQuc2FtcGxlX2Nvci5kYXQNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICA2MzgxIEFwciAxMyAwMjoyOSBERV9pc29mb3Jtc18zLm1hdHJpeC5sb2cyLmNlbnRlcmVkLnNhbXBsZV9jb3JfbWF0cml4LnBkZg0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgIDQ0NjUgQXByIDEzIDAyOjI5IERFX2lzb2Zvcm1zXzMubWF0cml4LlINCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgIDM0NDA5IEFwciAxMyAwMjoyOSBERV9pc29mb3Jtc18zLm1hdHJpeC5SRGF0YQ0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHBkZnRvb2xzKQ0KDQpgYGANCg0KDQpgYGB7cn0NCnBkZl9jb252ZXJ0KCdpc29mb3Jtc19ERV8zL0RFX2lzb2Zvcm1zXzMubWF0cml4LmxvZzIuY2VudGVyZWQuZ2VuZXNfdnNfc2FtcGxlc19oZWF0bWFwLnBkZicsIGZvcm1hdCA9ICJqcGVnIiwgcGFnZXMgPSBOVUxMLCBmaWxlbmFtZXMgPSBOVUxMLCBkcGkgPSAzMDAsIGFudGlhbGlhcyA9IFRSVUUsIG9wdyA9ICIiLCB1cHcgPSAiIiwgdmVyYm9zZSA9IFRSVUUpDQoNCmBgYA0KDQoNCiFbZ2VuZXNfdnNfc2FtcGxlX2hlYXRtYXBdKERFX2lzb2Zvcm1zXzMubWF0cml4LmxvZzIuY2VudGVyZWQuZ2VuZXNfdnNfc2FtcGxlc19oZWF0bWFwXzEuanBlZykNCg0KDQoNCmBgYHtyfQ0KcGRmX2NvbnZlcnQoJ2lzb2Zvcm1zX0RFXzMvREVfaXNvZm9ybXNfMy5tYXRyaXgubG9nMi5jZW50ZXJlZC5zYW1wbGVfY29yX21hdHJpeC5wZGYnLCBmb3JtYXQgPSAianBlZyIsIHBhZ2VzID0gTlVMTCwgZmlsZW5hbWVzID0gTlVMTCwgZHBpID0gMzAwLCBhbnRpYWxpYXMgPSBUUlVFLCBvcHcgPSAiIiwgdXB3ID0gIiIsIHZlcmJvc2UgPSBUUlVFKQ0KDQpgYGANCg0KDQoNCiFbc2FtcGxlX2Nvcl9tYXRyaXhdKERFX2lzb2Zvcm1zXzMubWF0cml4LmxvZzIuY2VudGVyZWQuc2FtcGxlX2Nvcl9tYXRyaXhfMS5qcGVnKQ0KDQoNCiMjIDguIGVkZ2VSIGFuYWx5c2lzIG9mIGRpZmZlcmVudGFpbCBnZW5lICBleHByZXNzaW9uIChzaW1pbGFyIHRvIHRoZSBpc29mb3JtcyBhbmFseXNpcyBkb25lIGFib3ZlKQ0KDQojIyMgR2VuZXJhdGUgYSBtYXRyaXggZmlsZSBvZiBhYnVuZGFuY2UgZXN0aW1hdGVzDQoNCg0KYGBgDQoNCnN0YXItdHJhbnNjcmlwdG9tZW91dCQgYWJ1bmRhbmNlX2VzdGltYXRlc190b19tYXRyaXgucGwgDQoNCi0tZXN0X21ldGhvZCBSU0VNIA0KDQoxb3V0Ly5nZW5lcy5yZXN1bHRzIA0KMm91dC8uZ2VuZXMucmVzdWx0cyANCjNvdXQvLmdlbmVzLnJlc3VsdHMgDQo0b3V0Ly5nZW5lcy5yZXN1bHRzIA0KNW91dC8uZ2VuZXMucmVzdWx0cyANCjZvdXQvLmdlbmVzLnJlc3VsdHMgDQoNCi0tZ2VuZV90cmFuc19tYXAgbm9uZSANCg0KLS1uYW1lX3NhbXBsZV9ieV9iYXNlZGlyIA0KDQotLW91dF9wcmVmaXggZ2VuZXNfZ2VuZV90cmFuc19tYXBfbm9uZS9nZW5lcw0KDQpgYGANCg0KLXJlYWRpbmcgZmlsZTogMW91dC8uZ2VuZXMucmVzdWx0cw0KDQotcmVhZGluZyBmaWxlOiAyb3V0Ly5nZW5lcy5yZXN1bHRzDQoNCi1yZWFkaW5nIGZpbGU6IDNvdXQvLmdlbmVzLnJlc3VsdHMNCg0KLXJlYWRpbmcgZmlsZTogNG91dC8uZ2VuZXMucmVzdWx0cw0KDQotcmVhZGluZyBmaWxlOiA1b3V0Ly5nZW5lcy5yZXN1bHRzDQoNCi1yZWFkaW5nIGZpbGU6IDZvdXQvLmdlbmVzLnJlc3VsdHMNCg0KDQoqIE91dHB1dHRpbmcgY29tYmluZWQgbWF0cml4Lg0KDQovaG9tZS9iZGFzaC9taW5pY29uZGEyL29wdC90cmluaXR5LTIuNi42L3V0aWwvc3VwcG9ydF9zY3JpcHRzL3J1bl9UTU1fc2NhbGVfbWF0cml4LnBsIC0tbWF0cml4IGdlbmVzX2dlbmVfdHJhbnNfbWFwX25vbmUvZ2VuZXMuaXNvZm9ybS5UUE0ubm90X2Nyb3NzX25vcm0gPiBnZW5lc19nZW5lX3RyYW5zX21hcF9ub25lL2dlbmVzLmlzb2Zvcm0uVE1NLkVYUFIubWF0cml4Q01EOiBSIC0tbm8tc2F2ZSAtLW5vLXJlc3RvcmUgLS1uby1zaXRlLWZpbGUgLS1uby1pbml0LWZpbGUgLXEgPCBnZW5lc19nZW5lX3RyYW5zX21hcF9ub25lL2dlbmVzLmlzb2Zvcm0uVFBNLm5vdF9jcm9zc19ub3JtLnJ1blRNTS5SIDE+JjIgDQoNCg0KLi4uLi4uLi4uLi4uLi4uLg0KDQoNCiMjIyMgc3Rhci10cmFuc2NyaXB0b21lb3V0JCBscyAtbCBnZW5lc19nZW5lX3RyYW5zX21hcF9ub25lLw0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoIDc2NDg0NyBBcHIgMTIgMTI6MjQgZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggODA1OTAzIEFwciAxMiAxMjoyNCBnZW5lcy5pc29mb3JtLlRNTS5FWFBSLm1hdHJpeA0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoIDYyMjUzNyBBcHIgMTIgMTI6MjQgZ2VuZXMuaXNvZm9ybS5UUE0ubm90X2Nyb3NzX25vcm0NCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICA1NzggQXByIDEyIDEyOjI0IGdlbmVzLmlzb2Zvcm0uVFBNLm5vdF9jcm9zc19ub3JtLnJ1blRNTS5SDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgMzE4IEFwciAxMiAxMjoyNCBnZW5lcy5pc29mb3JtLlRQTS5ub3RfY3Jvc3Nfbm9ybS5UTU1faW5mby50eHQNCg0KDQoNCg0KDQojIyMgREUgYW5hbHlzaXMgb2YgZ2VuZSBleHByZXNzaW9uOiBQcmlkdWNlcyBNQSBwbG90LCB2b2xjYW5vIHBsb3QgYW5kIGNvdW50cyBtYXRyaXgNCg0KIE5vdGUgYmlvbG9naWFjbCB0cmlwbGljYXRlcyBmb3IgZWFjaCBncm91cCAoc2VlIGJlbG93KQ0KDQoNCmBgYA0Kc3Rhci10cmFuc2NyaXB0b21lb3V0JCBydW5fREVfYW5hbHlzaXMucGwgDQoNCi0tbWF0cml4IGdlbmVzX2dlbmVfdHJhbnNfbWFwX25vbmUvZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4IA0KDQotLW91dHB1dCBnZW5lc19ERV8zLyANCg0KLS1zYW1wbGVzX2ZpbGUgc2FtcGxlc19kZXNjcmliZWQudHh0IA0KDQotLW1ldGhvZCBlZGdlUg0KDQpgYGANCg0KR290IDYgc2FtcGxlcywgYW5kIGdvdDogNyBkYXRhIGZpZWxkcy4NCg0KSGVhZGVyOiAxb3V0CTJvdXQJM291dAk0b3V0CTVvdXQJNm91dA0KDQpOZXh0OiBPbHIxNTAxCTAuMDAJMC4wMAkwLjAwCTAuMDAJMC4wMAkwLjAwDQoNCiRWQVIxID0gew0KICAgICAgICAgICc1b3V0JyA9PiA1LA0KICAgICAgICAgICc2b3V0JyA9PiA2LA0KICAgICAgICAgICczb3V0JyA9PiAzLA0KICAgICAgICAgICcxb3V0JyA9PiAxLA0KICAgICAgICAgICcyb3V0JyA9PiAyLA0KICAgICAgICAgICc0b3V0JyA9PiA0DQogICAgICAgIH07DQogICAgICAgIA0KJFZBUjEgPSB7DQogICAgICAgICAgJ2NvbmRpdGlvbkInID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNG91dCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzVvdXQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICc2b3V0Jw0KICAgICAgICAgICAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICdjb25kaXRpb25BJyA9PiBbDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzFvdXQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyb3V0JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnM291dCcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgXQ0KICAgICAgICB9Ow0KICAgICAgICANCkNvbnRyYXN0cyB0byBwZXJmb3JtIGFyZTogJFZBUjEgPSBbDQogICAgICAgICAgWw0KICAgICAgICAgICAgJ2NvbmRpdGlvbkEnLA0KICAgICAgICAgICAgJ2NvbmRpdGlvbkInDQogICAgICAgICAgXQ0KICAgICAgICBdOw0KICAgICAgICANCiAgICAgICAgDQpDTUQ6IFIgLS1uby1zYXZlIC0tbm8tcmVzdG9yZSAtLW5vLXNpdGUtZmlsZSAtLW5vLWluaXQtZmlsZSAtcSA8IGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5jb25kaXRpb25BX3ZzX2NvbmRpdGlvbkIuY29uZGl0aW9uQS52cy5jb25kaXRpb25CLkVkZ2VSLlJzY3JpcHQNCg0KDQouLi4uLi4uLi4uLi4uLi4NCg0KIyMjIyBzdGFyLXRyYW5zY3JpcHRvbWVvdXQkIGxzIC1sIGdlbmVzX0RFXzMvDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgMTQxMCBBcHIgMTMgMDI6MTIgZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LmNvbmRpdGlvbkFfdnNfY29uZGl0aW9uQi5jb25kaXRpb25BLnZzLmNvbmRpdGlvbkIuRWRnZVIuUnNjcmlwdA0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAzNTIyNzcgQXByIDEzIDAyOjEzIGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5jb25kaXRpb25BX3ZzX2NvbmRpdGlvbkIuZWRnZVIuY291bnRfbWF0cml4DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggMTAxMDI4NCBBcHIgMTMgMDI6MTMgZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LmNvbmRpdGlvbkFfdnNfY29uZGl0aW9uQi5lZGdlUi5ERV9yZXN1bHRzDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggIDExMjY5NSBBcHIgMTMgMDI6MTMgZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LmNvbmRpdGlvbkFfdnNfY29uZGl0aW9uQi5lZGdlUi5ERV9yZXN1bHRzLk1BX25fVm9sY2Fuby5wZGYNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgMzU1IEFwciAxMyAwMjoyMSBnZW5lcy5pc29mb3JtLmNvdW50cy5tYXRyaXguY29uZGl0aW9uQV92c19jb25kaXRpb25CLmVkZ2VSLkRFX3Jlc3VsdHMuUDAuMDAxX0MyLmNvbmRpdGlvbkEtVVAuc3Vic2V0DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgICA3MCBBcHIgMTMgMDI6MjEgZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LmNvbmRpdGlvbkFfdnNfY29uZGl0aW9uQi5lZGdlUi5ERV9yZXN1bHRzLlAwLjAwMV9DMi5jb25kaXRpb25CLVVQLnN1YnNldA0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgICAzNTUgQXByIDEzIDAyOjIxIGdlbmVzLmlzb2Zvcm0uY291bnRzLm1hdHJpeC5jb25kaXRpb25BX3ZzX2NvbmRpdGlvbkIuZWRnZVIuREVfcmVzdWx0cy5QMC4wMDFfQzIuREUuc3Vic2V0DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgICA5NiBBcHIgMTMgMDI6MjEgZ2VuZXMuaXNvZm9ybS5jb3VudHMubWF0cml4LmNvbmRpdGlvbkFfdnNfY29uZGl0aW9uQi5lZGdlUi5ERV9yZXN1bHRzLnNhbXBsZXMNCg0KDQoNCg0KDQoNCiFbZ2VuZXNfTUFfcGxvdF0oZ2VuZXNfREVfMy9nZW5lc19NQXBsb3QuanBnKQ0KDQoNCg0KIVtnZW5lc192b2xjYW5vX3Bsb3RdKGdlbmVzX0RFXzMvZ2VuZXNfdm9sY2Fub19wbG90LmpwZykNCg0KDQoNCiMjIyBBbmFseXplIGRpZmZlcmVudGlhbCBnZW5lIGV4cHJlc3Npb246IFByb2R1Y2VzIGhlYXRtYXAgYW5kIGNvb3JlbGF0aW9uIG1hdHJpeA0KDQoNCmBgYA0KZ2VuZXNfREVfMyQgYW5hbHl6ZV9kaWZmX2V4cHIucGwgDQoNCi0tbWF0cml4IC4uL2dlbmVzX2dlbmVfdHJhbnNfbWFwX25vbmUvZ2VuZXMuaXNvZm9ybS5UTU0uRVhQUi5tYXRyaXggDQoNCi0tc2FtcGxlcyAuLi9zYW1wbGVzX2Rlc2NyaWJlZC50eHQgDQoNCi0tb3V0cHV0IERFX2dlbmVzXzMNCg0KYGBgDQoNCg0KKipGb3VuZCAyIGZlYXR1cmVzIGFzIGRpZmZlcmVudGlhbGx5IGV4cHJlc3NlZC4qKg0KDQpDTUQ6IC9ob21lL2JkYXNoL21pbmljb25kYTIvb3B0L3RyaW5pdHktMi42LjYvQW5hbHlzaXMvRGlmZmVyZW50aWFsRXhwcmVzc2lvbi9QdFIgLW0gREVfZ2VuZXNfMy5tYXRyaXggLS1sb2cyIC0taGVhdG1hcCAtLW1pbl9jb2xTdW1zIDAgLS1taW5fcm93U3VtcyAwIC0tZ2VuZV9kaXN0IGV1Y2xpZGVhbiAtLXNhbXBsZV9kaXN0IGV1Y2xpZGVhbiAtLXNhbXBsZV9jb3JfbWF0cml4IC0tY2VudGVyX3Jvd3MgLS1zYXZlICAtcyAuLi9zYW1wbGVzX2Rlc2NyaWJlZC50eHQNCkNNRDogUiAtLW5vLXNhdmUgLS1uby1yZXN0b3JlIC0tbm8tc2l0ZS1maWxlIC0tbm8taW5pdC1maWxlIC1xIDwgREVfZ2VuZXNfMy5tYXRyaXguUg0KDQoNCi4uLi4uLg0KDQoNCiMjIyMgc3Rhci10cmFuc2NyaXB0b21lb3V0JCBscyAtbCBnZW5lc19ERV8zLw0KDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgICA1MyBBcHIgMTMgMDI6MjEgREVfZmVhdHVyZV9jb3VudHMuUDAuMDAxX0MyLm1hdHJpeA0KDQotcnctcnctci0tLiAxIGJkYXNoIGJkYXNoICAgICAxMjAgQXByIDEzIDAyOjIxIERFX2dlbmVzXzMubWF0cml4DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgIDI1NiBBcHIgMTMgMDI6MjEgREVfZ2VuZXNfMy5tYXRyaXgubG9nMi5jZW50ZXJlZC5kYXQNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICA1OTc3IEFwciAxMyAwMjoyMSBERV9nZW5lc18zLm1hdHJpeC5sb2cyLmNlbnRlcmVkLmdlbmVzX3ZzX3NhbXBsZXNfaGVhdG1hcC5wZGYNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICAgMTQ4IEFwciAxMyAwMjoyMSBERV9nZW5lc18zLm1hdHJpeC5sb2cyLmNlbnRlcmVkLnNhbXBsZV9jb3IuZGF0DQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAgNjMxMSBBcHIgMTMgMDI6MjEgREVfZ2VuZXNfMy5tYXRyaXgubG9nMi5jZW50ZXJlZC5zYW1wbGVfY29yX21hdHJpeC5wZGYNCg0KLXJ3LXJ3LXItLS4gMSBiZGFzaCBiZGFzaCAgICA0NDM1IEFwciAxMyAwMjoyMSBERV9nZW5lc18zLm1hdHJpeC5SDQoNCi1ydy1ydy1yLS0uIDEgYmRhc2ggYmRhc2ggICAzMzIxNCBBcHIgMTMgMDI6MjEgREVfZ2VuZXNfMy5tYXRyaXguUkRhdGENCg0KDQoNCmBgYHtyfQ0KbGlicmFyeShwZGZ0b29scykNCg0KYGBgDQoNCmBgYHtyfQ0KcGRmX2NvbnZlcnQoJ2dlbmVzX0RFXzMvREVfZ2VuZXNfMy5tYXRyaXgubG9nMi5jZW50ZXJlZC5nZW5lc192c19zYW1wbGVzX2hlYXRtYXAucGRmJywgZm9ybWF0ID0gImpwZWciLCBwYWdlcyA9IE5VTEwsIGZpbGVuYW1lcyA9IE5VTEwsIGRwaSA9IDMwMCwgYW50aWFsaWFzID0gVFJVRSwgb3B3ID0gIiIsIHVwdyA9ICIiLCB2ZXJib3NlID0gVFJVRSkNCg0KYGBgDQoNCg0KIVtnZW5lc19oZWF0bWFwXShERV9nZW5lc18zLm1hdHJpeC5sb2cyLmNlbnRlcmVkLmdlbmVzX3ZzX3NhbXBsZXNfaGVhdG1hcF8xLmpwZWcpDQoNCg0KDQoNCg0KDQpgYGB7cn0NCnBkZl9jb252ZXJ0KCdnZW5lc19ERV8zL0RFX2dlbmVzXzMubWF0cml4LmxvZzIuY2VudGVyZWQuc2FtcGxlX2Nvcl9tYXRyaXgucGRmJywgZm9ybWF0ID0gImpwZWciLCBwYWdlcyA9IE5VTEwsIGZpbGVuYW1lcyA9IE5VTEwsIGRwaSA9IDMwMCwgYW50aWFsaWFzID0gVFJVRSwgb3B3ID0gIiIsIHVwdyA9ICIiLCB2ZXJib3NlID0gVFJVRSkNCg0KYGBgDQoNCg0KIVtnZW5lc19jb3JyZWxhdGlvbl9tYXRyaXhdKERFX2dlbmVzXzMubWF0cml4LmxvZzIuY2VudGVyZWQuc2FtcGxlX2Nvcl9tYXRyaXhfMS5qcGVnKQ0KDQo=