A1. References and resources
We will analyze the exome sequence of an individual (HG02759).
Machine
Google Cloud Platform (GCP), 4 vCPUs, 15 GB
Google Cloud Platform (GCP), 24 vCPUs, 32 GB
A2. Download analysis datasets (the fastq files)
Continuing in background, pid 3644.
Continuing in background, pid 3664.
Continuing in background, pid 3666.
Continuing in background, pid 3679.
Directory contents
~/gatk-data-ref$ ls -l
-rw-rw-r– 1 b0d2647 b0d2647 2323935206 Apr 25 23:22 ERR250409_1.fastq.gz
-rw-rw-r– 1 b0d2647 b0d2647 2340353386 Apr 25 23:25 ERR250409_2.fastq.gz
-rw-rw-r– 1 b0d2647 b0d2647 2298503669 Apr 25 23:19 ERR250410_1.fastq.gz
-rw-rw-r– 1 b0d2647 b0d2647 2313000285 Apr 25 23:21 ERR250410_2.fastq.gz
A3. Dwonload the refrence and/or genome files (from the GATK resources bundle maintained by Broad Institure in a google bucket)
~/gatk_data_ref$ gsutil cp gs://genomics-public-data/resources/broad/hg38/v0/Homo_sapiens_assembly38.fasta ./
Copying gs://genomics-public-data/resources/broad/hg38/v0/Homo_sapiens_assembly38.fasta…
~/gatk_data_ref$ gsutil cp gs://genomics-public-data/resources/broad/hg38/v0/Homo_sapiens_assembly38.dict ./
Copying gs://genomics-public-data/resources/broad/hg38/v0/Homo_sapiens_assembly38.dict…
~/gatk_data_ref$ gsutil cp gs://genomics-public-data/resources/broad/hg38/v0/Homo_sapiens_assembly38.fasta.fai ./
Copying gs://genomics-public-data/resources/broad/hg38/v0/Homo_sapiens_assembly38.fasta.fai…
Additional directory contents
~/gatk-data-ref$ ls -l
-rw-rw-r– 1 b0d2647 b0d2647 581712 Apr 20 13:42 Homo_sapiens_assembly38.dict
-rw-rw-r– 1 b0d2647 b0d2647 3249912778 Apr 20 13:44 Homo_sapiens_assembly38.fasta
-rw-rw-r– 1 b0d2647 b0d2647 160928 Apr 20 16:47 Homo_sapiens_assembly38.fasta.fai
A4. Make a BWA index of the human genome
~/gatk_data_ref$ bwa index -a bwtsw Homo_sapiens_assembly38.fasta
[bwa_index] Pack FASTA… 30.70 sec
[bwa_index] Construct BWT for the packed sequence…
[BWTIncCreate] textLength=6434693834, availableWord=464768632
[BWTIncConstructFromPacked] 10 iterations done. 99999994 characters processed.
………….
[BWTIncConstructFromPacked] 710 iterations done. 6432978554 characters processed.
[bwt_gen] Finished constructing BWT in 711 iterations.
[bwa_index] 4734.94 seconds elapse.
[bwa_index] Update BWT… 23.36 sec
[bwa_index] Pack forward-only FASTA… 22.12 sec
[bwa_index] Construct SA from BWT and Occ… 2665.77 sec
[main] Version: 0.7.17-r1188
[main] CMD: bwa index -a bwtsw Homo_sapiens_assembly38.fasta
[main] Real time: 7558.780 sec; CPU: 7476.896 sec
Additional directory contents
~/gatk-data-ref$ ls -l
-rw-rw-r– 1 b0d2647 b0d2647 487553 Apr 21 22:49 Homo_sapiens_assembly38.fasta.64.alt
-rw-rw-r– 1 b0d2647 b0d2647 20199 Apr 21 22:49 Homo_sapiens_assembly38.fasta.64.amb
-rw-rw-r– 1 b0d2647 b0d2647 455474 Apr 21 22:49 Homo_sapiens_assembly38.fasta.64.ann
-rw-rw-r– 1 b0d2647 b0d2647 3217347004 Apr 21 22:49 Homo_sapiens_assembly38.fasta.64.bwt
-rw-rw-r– 1 b0d2647 b0d2647 804336731 Apr 21 22:49 Homo_sapiens_assembly38.fasta.64.pac
-rw-rw-r– 1 b0d2647 b0d2647 1608673512 Apr 21 22:50 Homo_sapiens_assembly38.fasta.64.sa
A5. Align the 1st pair of sequences to the reference genome using Burrows-Wheeler Aligner (BWA)
Note: It is important to assign read groups (RG) to the sequences
A6. Validate the BAM file
~/gatk-data-ref$ gatk ValidateSamFile -R Homo_sapiens_assembly38.fasta -I ERR250409_1.bam -M SUMMARY -O summary_ERR250409_1
Using GATK jar /home/b0d2647/miniconda3/share/gatk4-4.1.2.0-0/gatk-package-4.1.2.0-local.jar
………………
INFO 2019-04-26 20:42:47 SamFileValidator Validated Read 10,000,000 records. Elapsed time: 00:03:10s. Time for last 10,000,000: 188s. Last read position: chr3:46,464,846
………………….
INFO 2019-04-26 20:55:16 SamFileValidator Validated Read 50,000,000 records. Elapsed time: 00:15:39s. Time for last 10,000,000: 191s. Last read position: chrX:136,689,677
[Fri Apr 26 20:57:28 UTC 2019] picard.sam.ValidateSamFile done. Elapsed time: 17.89 minutes.
Tool returned: 3
~/gatk-data-ref$ cat summary_ERR250409_1
## HISTOGRAM java.lang.String
Error Type Count
ERROR:INVALID_TAG_NM 126
A7. Mark duplicates
~/gatk-data-ref$ gatk MarkDuplicates -I ERR250409_1.bam -O ERR250409_1.mdup.bam -M ERR250409_1.dupMetrics.txt
Using GATK jar /home/b0d2647/miniconda3/share/gatk4-4.1.2.0-0/gatk-package-4.1.2.0-local.jar
…………….
INFO 2019-04-26 22:52:41 MarkDuplicates Reading input file and constructing read end information.
INFO 2019-04-26 22:52:41 MarkDuplicates Will retain up to 27158498 data points before spilling to disk.
WARNING 2019-04-26 22:52:41 AbstractOpticalDuplicateFinderCommandLineProgram A field field parsed out of a read name was expected to contain an integ er and did not. Read name: ERR250409.2131079. Cause: String ‘ERR250409.2131079’ did not start with a parsable number.
INFO 2019-04-26 22:52:49 MarkDuplicates Read 1,000,000 records. Elapsed time: 00:00:07s. Time for last 1,000,000: 7s. Last read position: chr1 :32,684,321
……………..
A9. Again validate the bam file
~/gatk-data-ref$ gatk ValidateSamFile -R Homo_sapiens_assembly38.fasta -I ERR250409_1.mdup.calmd.bam -M SUMMARY -O summary_ERR250409_1.mdup.calmd
A10. Index the error-fixed BAM file
~/gatk-data-ref$ samtools index ERR250409_1.mdup.calmd.bam
A11. Run gatk HaplotypeCaller
~/gatk-data-ref$ gatk HaplotypeCaller -R Homo_sapiens_assembly38.fasta -I ERR250409_1.mdup.calmd.bam -L chr20:15,800,000-16,100,000 -O ERR250409_1.mdup.calmd.vcf
Using GATK jar /home/b0d2647/miniconda3/share/gatk4-4.1.2.0-0/gatk-package-4.1.2.0-local.jar
………
11 read(s) filtered by: (((MappingQualityReadFilter AND MappingQualityAvailableReadFilter) AND MappedReadFilter) AND NotSecondaryAlignmentReadFilter)
5 read(s) filtered by: ((MappingQualityReadFilter AND MappingQualityAvailableReadFilter) AND MappedReadFilter)
5 read(s) filtered by: (MappingQualityReadFilter AND MappingQualityAvailableReadFilter)
5 read(s) filtered by: MappingQualityReadFilter
6 read(s) filtered by: NotSecondaryAlignmentReadFilter
291 read(s) filtered by: NotDuplicateReadFilter
00:10:27.058 INFO ProgressMeter - chr20:16097167 0.0 1019 67039.5
00:10:27.058 INFO ProgressMeter - Traversal complete. Processed 1019 total regions in 0.0 minutes.
A12. Generare short variant (i.e., SNPs and indels) statistics
A13. Additional directory contents
~/gatk-data-ref$ ls -l
-rw-rw-r– 1 b0d2647 b0d2647 4098346475 Apr 26 20:28 ERR250409_1.bam
-rw-rw-r– 1 b0d2647 b0d2647 4863928 Apr 26 20:30 ERR250409_1.bam.bai
-rw-rw-r– 1 b0d2647 b0d2647 3388 Apr 26 23:03 ERR250409_1.dupMetrics.txt
-rw-rw-r– 1 b0d2647 b0d2647 4473831499 Apr 26 23:45 ERR250409_1.mdup.calmd.bam
-rw-rw-r– 1 b0d2647 b0d2647 4924784 Apr 27 00:06 ERR250409_1.mdup.calmd.bam.bai
-rw-rw-r– 1 b0d2647 b0d2647 176201 Apr 27 00:10 ERR250409_1.mdup.calmd.vcf
-rw-rw-r– 1 b0d2647 b0d2647 114173 Apr 27 00:10 ERR250409_1.mdup.calmd.vcf.idx
-rw-rw-r– 1 b0d2647 b0d2647 75 Apr 26 20:57 summary_ERR250409_1
-rw-rw-r– 1 b0d2647 b0d2647 16 Apr 26 23:52 summary_ERR250409_1_mdup_calmd
ALIGN AND ANALYZE THE 2ND PAIR OF FASTQ SEQUENCES
B1. Align the 2nd pair of fastq sequences to the reference genome using BWA
Fastq file contents
~/gatk-data-ref$ zcat ERR250410_1.fastq.gz | head -n 2
@ERR250410.1 FCC1HA8ACXX:5:1101:1137:1984/1
NTGTAAGTTTTTCTAGGTTATACCACTTTCCAGTGATGACACTTTTTATATTTTGTTATATTTTACTTTAATTGAAGCAAAGTGTGTTTATTCAATCCAG
~/gatk-data-ref$ zcat ERR250410_2.fastq.gz | head -n 2
@ERR250410.1 FCC1HA8ACXX:5:1101:1137:1984/2
GGCGATAAGAATTCCTTTCTGCCTCCTTGGCTAGAGTTGACACCTAAAAACAAAGAACACTGGATTGAATAAACACACTTTGCTTCAATTAAAGTAAAAN
B2. Validate the BAM file
~/gatk-data-ref$ gatk ValidateSamFile -R Homo_sapiens_assembly38.fasta -I ERR250410_1.bam -M SUMMARY -O summary_ERR250410_1
Using GATK jar /home/b0d2647/miniconda3/share/gatk4-4.1.2.0-0/gatk-package-4.1.2.0-local.jar
………………………
INFO 2019-04-27 23:33:34 SamFileValidator Validated Read 10,000,000 records. Elapsed time: 00:01:35s. Time for last 10,000,000: 94s. Last read position: chr3:48,974,785
…………………………
INFO 2019-04-27 23:39:56 SamFileValidator Validated Read 50,000,000 records. Elapsed time: 00:07:57s. Time for last 10,000,000: 98s. Last read position: chrUn_GL000224v1:55,172
[Sat Apr 27 23:40:56 UTC 2019] picard.sam.ValidateSamFile done. Elapsed time: 8.98 minutes.
……………..
~/gatk-data-ref$ cat summary_ERR250410_1
## HISTOGRAM java.lang.String
Error Type Count
ERROR:INVALID_TAG_NM 107
B4. Validate again after the fix
~/gatk-data-ref$ gatk ValidateSamFile -R Homo_sapiens_assembly38.fasta -I ERR250410_1.calmd.bam -M SUMMARY -O summary_ERR250410_1_calmd
Using GATK jar /home/b0d2647/miniconda3/share/gatk4-4.1.2.0-0/gatk-package-4.1.2.0-local.jar
……….
INFO 2019-04-28 00:45:36 SamFileValidator Validated Read 50,000,000 records. Elapsed time: 00:05:51s. Time for last 10,000,000: 70s. Last read position: chrUn_GL000224v1:55,172
[Sun Apr 28 00:45:39 UTC 2019] picard.sam.ValidateSamFile done. Elapsed time: 5.91 minutes.
….
Tool returned: 0
~/gatk-data-ref$ cat summary_ERR250410_1_calmd
No errors found
B5. Mark Duplicates on the error-fixed bam file
~/gatk-data-ref$ gatk MarkDuplicates -I ERR250410_1.calmd.bam -O ERR250410_1.calmd.mdup.bam -M ERR250410_1.calmd.dupMetrics.txt
…………
INFO 2019-04-28 02:28:18 SortingCollection Creating merging iterator from 2 files
………………
INFO 2019-04-28 02:28:33 MarkDuplicates Marking 6017225 records as duplicates.
INFO 2019-04-28 02:28:33 MarkDuplicates Found 0 optical duplicate clusters.
INFO 2019-04-28 02:28:33 MarkDuplicates Reads are assumed to be ordered by: coordinate
INFO 2019-04-28 02:29:16 MarkDuplicates Written 10,000,000 records. Elapsed time: 00:00:42s. Time for last 10,000,000: 42s. Last read position: chr3:48,974,785
……………………..
INFO 2019-04-28 02:32:13 MarkDuplicates Written 50,000,000 records. Elapsed time: 00:03:39s. Time for last 10,000,000: 45s. Last read position: chrUn_GL000224v1:55,172
[Sun Apr 28 02:32:15 UTC 2019] picard.sam.markduplicates.MarkDuplicates done. Elapsed time: 11.17 minutes.
B6. Index the BAM file
samtools index ERR250410_1.calmd.mdup.bam
B7. Run gatk HaplotypeCaller
~/gatk-data-ref$ gatk HaplotypeCaller -R Homo_sapiens_assembly38.fasta -I ERR250410_1.calmd.mdup.bam -L chr20:15,800,000-16,100,000 -O ERR250410_1.calmd.mdup.vcf
Using GATK jar /home/b0d2647/miniconda3/share/gatk4-4.1.2.0-0/gatk-package-4.1.2.0-local.jar
………………..
02:43:51.330 INFO HaplotypeCaller -
239 read(s) filtered by: ((((((((MappingQualityReadFilter AND MappingQualityAvailableReadFilter) AND MappedReadFilter) AND NotSecondaryAlignmentReadFilter) AND NotDuplicateReadFilter) AND PassesVendorQualityCheckReadFilter) AND NonZeroReferenceLengthAlignmentReadFilter) AND GoodCigarReadFilter) AND WellformedReadFilter)
239 read(s) filtered by: (((((((MappingQualityReadFilter AND MappingQualityAvailableReadFilter) AND MappedReadFilter) AND NotSecondaryAlignmentReadFilter) AND NotDuplicateReadFilter) AND PassesVendorQualityCheckReadFilter) AND NonZeroReferenceLengthAlignmentReadFilter) AND GoodCigarReadFilter)
239 read(s) filtered by: ((((((MappingQualityReadFilter AND MappingQualityAvailableReadFilter) AND MappedReadFilter) AND NotSecondaryAlignmentReadFilter) AND NotDuplicateReadFilter) AND PassesVendorQualityCheckReadFilter) AND NonZeroReferenceLengthAlignmentReadFilter)
239 read(s) filtered by: (((((MappingQualityReadFilter AND MappingQualityAvailableReadFilter) AND MappedReadFilter) AND NotSecondaryAlignmentReadFilter) AND NotDuplicateReadFilter) AND PassesVendorQualityCheckReadFilter)
239 read(s) filtered by: ((((MappingQualityReadFilter AND MappingQualityAvailableReadFilter) AND MappedReadFilter) AND NotSecondaryAlignmentReadFilter) AND NotDuplicateReadFilter)
14 read(s) filtered by: (((MappingQualityReadFilter AND MappingQualityAvailableReadFilter) AND MappedReadFilter) AND NotSecondaryAlignmentReadFilter)
10 read(s) filtered by: ((MappingQualityReadFilter AND MappingQualityAvailableReadFilter) AND MappedReadFilter)
10 read(s) filtered by: (MappingQualityReadFilter AND MappingQualityAvailableReadFilter)
10 read(s) filtered by: MappingQualityReadFilter
4 read(s) filtered by: NotSecondaryAlignmentReadFilter
225 read(s) filtered by: NotDuplicateReadFilter
02:43:51.330 INFO ProgressMeter - chr20:16097434 0.0 1018 66103.9
02:43:51.331 INFO ProgressMeter - Traversal complete. Processed 1018 total regions in 0.0 minutes.
…………
B8. Report the short varinats (SNPs and indels)
B9. Additional directory contents
~/gatk-data-ref$ ls -l
-rw-rw-r– 1 b0d2647 b0d2647 4051442816 Apr 27 23:25 ERR250410_1.bam
-rw-rw-r– 1 b0d2647 b0d2647 4857904 Apr 27 23:25 ERR250410_1.bam.bai
-rw-rw-r– 1 b0d2647 b0d2647 4375560628 Apr 28 00:36 ERR250410_1.calmd.bam
-rw-rw-r– 1 b0d2647 b0d2647 3405 Apr 28 02:32 ERR250410_1.calmd.dupMetrics.txt
-rw-rw-r– 1 b0d2647 b0d2647 5961522938 Apr 28 02:32 ERR250410_1.calmd.mdup.bam
-rw-rw-r– 1 b0d2647 b0d2647 5031664 Apr 28 02:37 ERR250410_1.calmd.mdup.bam.bai
-rw-rw-r– 1 b0d2647 b0d2647 175663 Apr 28 02:43 ERR250410_1.calmd.mdup.vcf
-rw-rw-r– 1 b0d2647 b0d2647 114173 Apr 28 02:43 ERR250410_1.calmd.mdup.vcf.idx
-rw-rw-r– 1 b0d2647 b0d2647 75 Apr 27 23:40 summary_ERR250410_1
-rw-rw-r– 1 b0d2647 b0d2647 16 Apr 28 00:45 summary_ERR250410_1_calmd
Combine both bam files and analyze for short variant discovery
C1. Merge the BAM files
~/gatk-data-ref$ gatk MergeSamFiles -I ERR250409_1.mdup.calmd.bam -I ERR250410_1.calmd.bam -O ERR25040910.calmd.bam
…………
INFO 2019-04-28 01:22:30 MergeSamFiles Processed 101,000,000 records. Elapsed time: 00:06:38s. Time for last 1,000,000: 5s. Last read position: chrUn_JTFH01000017v1_decoy:2,507
INFO 2019-04-28 01:22:31 MergeSamFiles Finished reading inputs.
[Sun Apr 28 01:22:31 UTC 2019] picard.sam.MergeSamFiles done. Elapsed time: 6.66 minutes.
C2. Mark duplicates
~/gatk-data-ref$ gatk MarkDuplicates -I ERR25040910.calmd.bam -O ERR25040910.calmd.mdup.bam -M ERR25040910.calmd.dupMetrics.txt
INFO 2019-04-28 01:46:43 MarkDuplicates Read 101045631 records. 0 pairs never matched.
……………..
INFO 2019-04-28 01:47:17 MarkDuplicates Will retain up to 236666880 duplicate indices before spilling to disk.
…………..
INFO 2019-04-28 01:47:18 SortingCollection Creating merging iterator from 2 files
……………….
INFO 2019-04-28 01:47:40 SortingCollection Creating merging iterator from 4 files
………….
INFO 2019-04-28 01:48:11 MarkDuplicates Marking 22068400 records as duplicates.
INFO 2019-04-28 01:48:11 MarkDuplicates Found 0 optical duplicate clusters.
INFO 2019-04-28 01:48:11 MarkDuplicates Reads are assumed to be ordered by: coordinate
INFO 2019-04-28 01:48:53 MarkDuplicates Written 10,000,000 records. Elapsed time: 00:00:41s. Time for last 10,000,000: 41s. Last read position: chr1:236,548,265
………………….
INFO 2019-04-28 01:55:18 MarkDuplicates Written 100,000,000 records. Elapsed time: 00:07:06s. Time for last 10,000,000: 43s. Last read position: chrY:12,915,859
………..
C3. Validate the BAM file again after merging and marking duplicates
~/gatk-data-ref$ gatk ValidateSamFile -R Homo_sapiens_assembly38.fasta -I ERR25040910.calmd.mdup.bam -M SUMMARY -O summary_ERR25040910.calmd.mdup
Using GATK jar /home/b0d2647/miniconda3/share/gatk4-4.1.2.0-0/gatk-package-4.1.2.0-local.jar
……………….
Tool returned:0
~/gatk-data-ref$ cat summary_ERR25040910.calmd.mdup
No errors found
C4. Index the bam file
~/gatk-data-ref$ samtools index ERR25040910.calmd.mdup.bam
C5. Run Haplotypecaller
~/gatk-data-ref$ gatk HaplotypeCaller -R Homo_sapiens_assembly38.fasta -I ERR25040910.calmd.mdup.bam -L chr20:15,800,000-16,100,000 -O ERR25040910.calmd.mdup.vcf
Using GATK jar /home/b0d2647/miniconda3/share/gatk4-4.1.2.0-0/gatk-package-4.1.2.0-local.jar
02:35:08.952 INFO HaplotypeCaller -
962 read(s) filtered by: ((((((((MappingQualityReadFilter AND MappingQualityAvailableReadFilter) AND MappedReadFilter) AND NotSecondaryAlignmentReadFilter) AND NotDuplicateReadFilter) AND PassesVendorQualityCheckReadFilter) AND NonZeroReferenceLengthAlignmentReadFilter) AND GoodCigarReadFilter) AND WellformedReadFilter)
962 read(s) filtered by: (((((((MappingQualityReadFilter AND MappingQualityAvailableReadFilter) AND MappedReadFilter) AND NotSe condaryAlignmentReadFilter) AND NotDuplicateReadFilter) AND PassesVendorQualityCheckReadFilter) AND NonZeroReferenceLengthAlignmentReadFilter) AND GoodCigarReadFilter)
962 read(s) filtered by: ((((((MappingQualityReadFilter AND MappingQualityAvailableReadFilter) AND MappedReadFilter) AND NotSecondaryAlignmentReadFilter) AND NotDuplicateReadFilter) AND PassesVendorQualityCheckReadFilter) AND NonZeroReferenceLengthAlignmentReadFilter)
962 read(s) filtered by: (((((MappingQualityReadFilter AND MappingQualityAvailableReadFilter) AND MappedReadFilter) AND NotSecondaryAlignmentReadFilter) AND NotDuplicateReadFilter) AND PassesVendorQualityCheckReadFilter)
962 read(s) filtered by: ((((MappingQualityReadFilter AND MappingQualityAvailableReadFilter) AND MappedReadFilter)AND NotSecondaryAlignmentReadFilter) AND NotDuplicateReadFilter)
25 read(s) filtered by: (((MappingQualityReadFilter AND MappingQualityAvailableReadFilter) AND MappedReadFilter) AND NotSecondaryAlignmentReadFilter)
15 read(s) filtered by: ((MappingQualityReadFilter AND MappingQualityAvailableReadFilter) AND MappedReadFilter)
15 read(s) filtered by: (MappingQualityReadFilter AND MappingQualityAvailableReadFilter)
15 read(s) filtered by: MappingQualityReadFilter
10 read(s) filtered by: NotSecondaryAlignmentReadFilter
937 read(s) filtered by: NotDuplicateReadFilter
02:35:08.953 INFO ProgressMeter - chr20:16097734 0.0 1027 48367.3
02:35:08.953 INFO ProgressMeter - Traversal complete. Processed 1027 total regions in 0.0 minutes.
C6. Report short variant (SNPs and indels) statistics
C7. Additional directory contents
~/gatk-data-ref$ ls -l
-rw-rw-r– 1 b0d2647 b0d2647 11820454094 Apr 28 01:22 ERR25040910.calmd.bam
-rw-rw-r– 1 b0d2647 b0d2647 3431 Apr 28 01:55 ERR25040910.calmd.dupMetrics.txt
-rw-rw-r– 1 b0d2647 b0d2647 176651 Apr 28 02:35 ERR25040910.calmd.mdup.vcf
-rw-rw-r– 1 b0d2647 b0d2647 114173 Apr 28 02:35 ERR25040910.calmd.mdup.vcf.idx
-rw-rw-r– 1 b0d2647 b0d2647 0 Apr 28 02:30 summary_ERR25040910.calmd.mdup
LS0tDQp0aXRsZTogIkFuYWx5c2lzIG9mIHdob2xlIGV4b21lIG9mIGFuIGluZGl2aWR1YWwgKEhHMDI3NTkpIGZyb20gdGhlIDEwMDAgZ2Vub21lIHByb2plY3QiDQphdXRob3I6ICJCaGFnaXJhdGhpIERhc2giDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCiMjIEExLiBSZWZlcmVuY2VzIGFuZCByZXNvdXJjZXMNCg0KIyMjIyBXZSB3aWxsIGFuYWx5emUgdGhlIGV4b21lIHNlcXVlbmNlIG9mIGFuIGluZGl2aWR1YWwgKEhHMDI3NTkpLg0KDQohWzEwMDBfZ2Vub21lX0hHMDI3NTldKGhnMDI3NTlleG9tZS5qcGVnKQ0KDQoNCg0KIyMjIyBNYWNoaW5lDQoNCkdvb2dsZSBDbG91ZCBQbGF0Zm9ybSAoR0NQKSwgNCB2Q1BVcywgMTUgR0INCiANCkdvb2dsZSBDbG91ZCBQbGF0Zm9ybSAoR0NQKSwgMjQgdkNQVXMsIDMyIEdCDQoNCg0KIyMgQTIuIERvd25sb2FkIGFuYWx5c2lzIGRhdGFzZXRzICh0aGUgZmFzdHEgZmlsZXMpDQoNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIHdnZXQgLWJxYyBmdHA6Ly9mdHAuc3JhLmViaS5hYy51ay92b2wxL2Zhc3RxL0VSUjI1MC9FUlIyNTA0MTAvRVJSMjUwNDEwXzEuZmFzdHEuZ3oNCkNvbnRpbnVpbmcgaW4gYmFja2dyb3VuZCwgcGlkIDM2NDQuDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCB3Z2V0IC1icWMgZnRwOi8vZnRwLnNyYS5lYmkuYWMudWsvdm9sMS9mYXN0cS9FUlIyNTAvRVJSMjUwNDA5L0VSUjI1MDQwOV8yLmZhc3RxLmd6DQpDb250aW51aW5nIGluIGJhY2tncm91bmQsIHBpZCAzNjY0Lg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgd2dldCAtYnFjIGZ0cDovL2Z0cC5zcmEuZWJpLmFjLnVrL3ZvbDEvZmFzdHEvRVJSMjUwL0VSUjI1MDQwOS9FUlIyNTA0MDlfMS5mYXN0cS5neg0KQ29udGludWluZyBpbiBiYWNrZ3JvdW5kLCBwaWQgMzY2Ni4NCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIHdnZXQgLWJxYyBmdHA6Ly9mdHAuc3JhLmViaS5hYy51ay92b2wxL2Zhc3RxL0VSUjI1MC9FUlIyNTA0MTAvRVJSMjUwNDEwXzIuZmFzdHEuZ3oNCkNvbnRpbnVpbmcgaW4gYmFja2dyb3VuZCwgcGlkIDM2NzkuDQoNCg0KIyMjIERpcmVjdG9yeSBjb250ZW50cw0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgbHMgLWwNCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgMjMyMzkzNTIwNiBBcHIgMjUgMjM6MjIgRVJSMjUwNDA5XzEuZmFzdHEuZ3oNCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgMjM0MDM1MzM4NiBBcHIgMjUgMjM6MjUgRVJSMjUwNDA5XzIuZmFzdHEuZ3oNCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgMjI5ODUwMzY2OSBBcHIgMjUgMjM6MTkgRVJSMjUwNDEwXzEuZmFzdHEuZ3oNCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgMjMxMzAwMDI4NSBBcHIgMjUgMjM6MjEgRVJSMjUwNDEwXzIuZmFzdHEuZ3oNCg0KDQoNCiMjIEEzLiBEd29ubG9hZCB0aGUgcmVmcmVuY2UgYW5kL29yIGdlbm9tZSBmaWxlcyAoZnJvbSB0aGUgR0FUSyByZXNvdXJjZXMgYnVuZGxlIG1haW50YWluZWQgYnkgQnJvYWQgSW5zdGl0dXJlIGluIGEgZ29vZ2xlIGJ1Y2tldCkNCg0KDQoNCiMjIyMgfi9nYXRrX2RhdGFfcmVmJCBnc3V0aWwgY3AgZ3M6Ly9nZW5vbWljcy1wdWJsaWMtZGF0YS9yZXNvdXJjZXMvYnJvYWQvaGczOC92MC9Ib21vX3NhcGllbnNfYXNzZW1ibHkzOC5mYXN0YSAuLw0KDQpDb3B5aW5nIGdzOi8vZ2Vub21pY3MtcHVibGljLWRhdGEvcmVzb3VyY2VzL2Jyb2FkL2hnMzgvdjAvSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEuLi4NCg0KDQojIyMjIH4vZ2F0a19kYXRhX3JlZiQgZ3N1dGlsIGNwIGdzOi8vZ2Vub21pY3MtcHVibGljLWRhdGEvcmVzb3VyY2VzL2Jyb2FkL2hnMzgvdjAvSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZGljdCAuLw0KDQpDb3B5aW5nIGdzOi8vZ2Vub21pY3MtcHVibGljLWRhdGEvcmVzb3VyY2VzL2Jyb2FkL2hnMzgvdjAvSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZGljdC4uLg0KDQoNCiMjIyMgfi9nYXRrX2RhdGFfcmVmJCBnc3V0aWwgY3AgZ3M6Ly9nZW5vbWljcy1wdWJsaWMtZGF0YS9yZXNvdXJjZXMvYnJvYWQvaGczOC92MC9Ib21vX3NhcGllbnNfYXNzZW1ibHkzOC5mYXN0YS5mYWkgLi8NCg0KQ29weWluZyBnczovL2dlbm9taWNzLXB1YmxpYy1kYXRhL3Jlc291cmNlcy9icm9hZC9oZzM4L3YwL0hvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhLmZhaS4uLg0KDQoNCg0KDQojIyMgQWRkaXRpb25hbCBkaXJlY3RvcnkgY29udGVudHMNCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgbHMgLWwNCg0KDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgICAgICA1ODE3MTIgQXByIDIwIDEzOjQyIEhvbW9fc2FwaWVuc19hc3NlbWJseTM4LmRpY3QNCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgMzI0OTkxMjc3OCBBcHIgMjAgMTM6NDQgSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGENCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgICAgIDE2MDkyOCBBcHIgMjAgMTY6NDcgSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEuZmFpDQoNCg0KDQoNCiMjIEE0LiBNYWtlIGEgQldBIGluZGV4IG9mIHRoZSBodW1hbiBnZW5vbWUNCg0KDQojIyMjIH4vZ2F0a19kYXRhX3JlZiQgYndhIGluZGV4IC1hIGJ3dHN3IEhvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhDQoNCg0KW2J3YV9pbmRleF0gUGFjayBGQVNUQS4uLiAzMC43MCBzZWMNCg0KW2J3YV9pbmRleF0gQ29uc3RydWN0IEJXVCBmb3IgdGhlIHBhY2tlZCBzZXF1ZW5jZS4uLg0KDQpbQldUSW5jQ3JlYXRlXSB0ZXh0TGVuZ3RoPTY0MzQ2OTM4MzQsIGF2YWlsYWJsZVdvcmQ9NDY0NzY4NjMyDQoNCltCV1RJbmNDb25zdHJ1Y3RGcm9tUGFja2VkXSAxMCBpdGVyYXRpb25zIGRvbmUuIDk5OTk5OTk0IGNoYXJhY3RlcnMgcHJvY2Vzc2VkLg0KDQoNCi4uLi4uLi4uLi4uLi4NCg0KDQoNCltCV1RJbmNDb25zdHJ1Y3RGcm9tUGFja2VkXSA3MTAgaXRlcmF0aW9ucyBkb25lLiA2NDMyOTc4NTU0IGNoYXJhY3RlcnMgcHJvY2Vzc2VkLg0KDQpbYnd0X2dlbl0gRmluaXNoZWQgY29uc3RydWN0aW5nIEJXVCBpbiA3MTEgaXRlcmF0aW9ucy4NCg0KW2J3YV9pbmRleF0gNDczNC45NCBzZWNvbmRzIGVsYXBzZS4NCg0KW2J3YV9pbmRleF0gVXBkYXRlIEJXVC4uLiAyMy4zNiBzZWMNCg0KW2J3YV9pbmRleF0gUGFjayBmb3J3YXJkLW9ubHkgRkFTVEEuLi4gMjIuMTIgc2VjDQoNCltid2FfaW5kZXhdIENvbnN0cnVjdCBTQSBmcm9tIEJXVCBhbmQgT2NjLi4uIDI2NjUuNzcgc2VjDQoNClttYWluXSBWZXJzaW9uOiAwLjcuMTctcjExODgNCg0KW21haW5dIENNRDogYndhIGluZGV4IC1hIGJ3dHN3IEhvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhDQoNClttYWluXSBSZWFsIHRpbWU6IDc1NTguNzgwIHNlYzsgQ1BVOiA3NDc2Ljg5NiBzZWMNCg0KDQojIyMgQWRkaXRpb25hbCBkaXJlY3RvcnkgY29udGVudHMNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGxzIC1sDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgICAgICA0ODc1NTMgQXByIDIxIDIyOjQ5IEhvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhLjY0LmFsdA0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICAgIDIwMTk5IEFwciAyMSAyMjo0OSBIb21vX3NhcGllbnNfYXNzZW1ibHkzOC5mYXN0YS42NC5hbWINCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgICAgIDQ1NTQ3NCBBcHIgMjEgMjI6NDkgSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEuNjQuYW5uDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgIDMyMTczNDcwMDQgQXByIDIxIDIyOjQ5IEhvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhLjY0LmJ3dA0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgODA0MzM2NzMxIEFwciAyMSAyMjo0OSBIb21vX3NhcGllbnNfYXNzZW1ibHkzOC5mYXN0YS42NC5wYWMNCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgMTYwODY3MzUxMiBBcHIgMjEgMjI6NTAgSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEuNjQuc2ENCg0KDQoNCiMjIEE1LiBBbGlnbiB0aGUgMXN0IHBhaXIgb2Ygc2VxdWVuY2VzIHRvIHRoZSByZWZlcmVuY2UgZ2Vub21lIHVzaW5nIEJ1cnJvd3MtV2hlZWxlciBBbGlnbmVyIChCV0EpDQoNCk5vdGU6IEl0IGlzIGltcG9ydGFudCB0byBhc3NpZ24gcmVhZCBncm91cHMgKFJHKSB0byB0aGUgc2VxdWVuY2VzDQoNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGJ3YSBtZW0gLU0gLXQgMjQgLVIgJ0BSR1x0SUQ6RVJSMjUwNDA5XHRMQjpaXHRQTDppbGx1bWluYVx0UFU6RkNDMUhBOEFDWFhcdFNNOkhHMDI3NTknIEhvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhIEVSUjI1MDQwOV8xLmZhc3RxLmd6IEVSUjI1MDQwOV8yLmZhc3RxLmd6IHwgc2FtdG9vbHMgdmlldyAtU2JoIHwgc2FtdG9vbHMgc29ydCAtbyBFUlIyNTA0MDlfMS5iYW0gLSAmJiBzYW10b29scyBpbmRleCBFUlIyNTA0MDlfMS5iYW0gJiYgc2FtdG9vbHMgZmxhZ3N0YXQgRVJSMjUwNDA5XzEuYmFtDQoNClttYWluXSBWZXJzaW9uOiAwLjcuMTctcjExODgNCg0KLi4uLi4uLi4uLi4NCg0KW21haW5dIFJlYWwgdGltZTogMTgzOC42Mzkgc2VjOyBDUFU6IDEzNjM4Ljc5NyBzZWMNCg0KW2JhbV9zb3J0X2NvcmVdIG1lcmdpbmcgZnJvbSAxOCBmaWxlcyBhbmQgMSBpbi1tZW1vcnkgYmxvY2tzLi4uDQoNCg0KYGBgDQo1MDgxMTM0NCArIDAgaW4gdG90YWwgKFFDLXBhc3NlZCByZWFkcyArIFFDLWZhaWxlZCByZWFkcykNCg0KNjkzNzUgKyAwIHNlY29uZGFyeQ0KDQoxNDY4MTEgKyAwIHN1cHBsZW1lbnRhcnkNCg0KMCArIDAgZHVwbGljYXRlcw0KDQo1MDY5ODE0NyArIDAgbWFwcGVkICg5OS43OCUgOiBOL0EpDQoNCjUwNTk1MTU4ICsgMCBwYWlyZWQgaW4gc2VxdWVuY2luZw0KDQoyNTI5NzU3OSArIDAgcmVhZDENCg0KMjUyOTc1NzkgKyAwIHJlYWQyDQoNCjQ5OTU3MDQ2ICsgMCBwcm9wZXJseSBwYWlyZWQgKDk4Ljc0JSA6IE4vQSkNCg0KNTAzNjk5NzggKyAwIHdpdGggaXRzZWxmIGFuZCBtYXRlIG1hcHBlZA0KDQoxMTE5ODMgKyAwIHNpbmdsZXRvbnMgKDAuMjIlIDogTi9BKQ0KDQoyNjQ0OTYgKyAwIHdpdGggbWF0ZSBtYXBwZWQgdG8gYSBkaWZmZXJlbnQgY2hyDQoNCjE5NzY0NSArIDAgd2l0aCBtYXRlIG1hcHBlZCB0byBhIGRpZmZlcmVudCBjaHIgKG1hcFE+PTUpDQoNCmBgYA0KDQojIyBBNi4gVmFsaWRhdGUgdGhlIEJBTSBmaWxlDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBnYXRrIFZhbGlkYXRlU2FtRmlsZSAtUiBIb21vX3NhcGllbnNfYXNzZW1ibHkzOC5mYXN0YSAtSSBFUlIyNTA0MDlfMS5iYW0gLU0gU1VNTUFSWSAtTyBzdW1tYXJ5X0VSUjI1MDQwOV8xDQoNClVzaW5nIEdBVEsgamFyIC9ob21lL2IwZDI2NDcvbWluaWNvbmRhMy9zaGFyZS9nYXRrNC00LjEuMi4wLTAvZ2F0ay1wYWNrYWdlLTQuMS4yLjAtbG9jYWwuamFyDQoNCi4uLi4uLi4uLi4uLi4uLi4uLg0KDQpJTkZPICAgIDIwMTktMDQtMjYgMjA6NDI6NDcgICAgIFNhbUZpbGVWYWxpZGF0b3IgICAgICAgIFZhbGlkYXRlZCBSZWFkICAgIDEwLDAwMCwwMDAgcmVjb3Jkcy4gIEVsYXBzZWQgdGltZTogMDA6MDM6MTBzLiAgVGltZSBmb3IgbGFzdCAxMCwwMDAsMDAwOiAgMTg4cy4gIExhc3QgcmVhZCBwb3NpdGlvbjogY2hyMzo0Niw0NjQsODQ2DQoNCg0KLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQoNCklORk8gICAgMjAxOS0wNC0yNiAyMDo1NToxNiAgICAgU2FtRmlsZVZhbGlkYXRvciAgICAgICAgVmFsaWRhdGVkIFJlYWQgICAgNTAsMDAwLDAwMCByZWNvcmRzLiAgRWxhcHNlZCB0aW1lOiAwMDoxNTozOXMuICBUaW1lIGZvciBsYXN0IDEwLDAwMCwwMDA6ICAxOTFzLiAgTGFzdCByZWFkIHBvc2l0aW9uOiBjaHJYOjEzNiw2ODksNjc3DQoNCg0KW0ZyaSBBcHIgMjYgMjA6NTc6MjggVVRDIDIwMTldIHBpY2FyZC5zYW0uVmFsaWRhdGVTYW1GaWxlIGRvbmUuIEVsYXBzZWQgdGltZTogMTcuODkgbWludXRlcy4NCg0KDQpUb29sIHJldHVybmVkOiAzDQoNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGNhdCBzdW1tYXJ5X0VSUjI1MDQwOV8xIA0KDQoNCmBgYA0KIyMgSElTVE9HUkFNICAgIGphdmEubGFuZy5TdHJpbmcNCg0KRXJyb3IgVHlwZSAgICAgIENvdW50DQoNCkVSUk9SOklOVkFMSURfVEFHX05NICAgIDEyNg0KDQpgYGANCg0KDQojIyBBNy4gTWFyayBkdXBsaWNhdGVzIA0KDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBnYXRrIE1hcmtEdXBsaWNhdGVzIC1JIEVSUjI1MDQwOV8xLmJhbSAtTyBFUlIyNTA0MDlfMS5tZHVwLmJhbSAtTSBFUlIyNTA0MDlfMS5kdXBNZXRyaWNzLnR4dA0KDQpVc2luZyBHQVRLIGphciAvaG9tZS9iMGQyNjQ3L21pbmljb25kYTMvc2hhcmUvZ2F0azQtNC4xLjIuMC0wL2dhdGstcGFja2FnZS00LjEuMi4wLWxvY2FsLmphcg0KDQouLi4uLi4uLi4uLi4uLi4uDQoNCg0KSU5GTyAgICAyMDE5LTA0LTI2IDIyOjUyOjQxICAgICBNYXJrRHVwbGljYXRlcyAgUmVhZGluZyBpbnB1dCBmaWxlIGFuZCBjb25zdHJ1Y3RpbmcgcmVhZCBlbmQgaW5mb3JtYXRpb24uDQoNCklORk8gICAgMjAxOS0wNC0yNiAyMjo1Mjo0MSAgICAgTWFya0R1cGxpY2F0ZXMgIFdpbGwgcmV0YWluIHVwIHRvIDI3MTU4NDk4IGRhdGEgcG9pbnRzIGJlZm9yZSBzcGlsbGluZyB0byBkaXNrLg0KDQpXQVJOSU5HIDIwMTktMDQtMjYgMjI6NTI6NDEgICAgIEFic3RyYWN0T3B0aWNhbER1cGxpY2F0ZUZpbmRlckNvbW1hbmRMaW5lUHJvZ3JhbSAgICAgICAgQSBmaWVsZCBmaWVsZCBwYXJzZWQgb3V0IG9mIGEgcmVhZCBuYW1lIHdhcyBleHBlY3RlZCB0byBjb250YWluIGFuIGludGVnDQplciBhbmQgZGlkIG5vdC4gUmVhZCBuYW1lOiBFUlIyNTA0MDkuMjEzMTA3OS4gQ2F1c2U6IFN0cmluZyAnRVJSMjUwNDA5LjIxMzEwNzknIGRpZCBub3Qgc3RhcnQgd2l0aCBhIHBhcnNhYmxlIG51bWJlci4NCg0KSU5GTyAgICAyMDE5LTA0LTI2IDIyOjUyOjQ5ICAgICBNYXJrRHVwbGljYXRlcyAgUmVhZCAgICAgMSwwMDAsMDAwIHJlY29yZHMuICBFbGFwc2VkIHRpbWU6IDAwOjAwOjA3cy4gIFRpbWUgZm9yIGxhc3QgMSwwMDAsMDAwOiAgICA3cy4gIExhc3QgcmVhZCBwb3NpdGlvbjogY2hyMQ0KOjMyLDY4NCwzMjENCg0KLi4uLi4uLi4uLi4uLi4uLi4NCg0KDQoNCg0KIyMgQTguIEZpeCB0aGUgZXJyb3IgdXNpbmcgc2FtdG9vbHMgY2FsbWQNCg0KDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBzYW10b29scyBjYWxtZCAtYkFyIEVSUjI1MDQwOV8xLm1kdXAuYmFtIEhvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhID4gRVJSMjUwNDA5XzEubWR1cC5jYWxtZC5iYW0NCg0KDQouLi4uLi4uLi4uLi4uDQoNCltiYW1fZmlsbG1kMV0gZGlmZmVyZW50IE1EIGZvciByZWFkICdFUlIyNTA0MDkuNzMxNTk2Mic6ICcyOUczRzRHMEEyOCcgLT4gJzI5RzNHNEcwQTI3TjAnDQoNCltiYW1fZmlsbG1kMV0gZGlmZmVyZW50IE5NIGZvciByZWFkICdFUlIyNTA0MDkuOTE5MjkxJzogNyAtPiA4DQoNCltiYW1fZmlsbG1kMV0gZGlmZmVyZW50IE1EIGZvciByZWFkICdFUlIyNTA0MDkuOTE5MjkxJzogJzI0RzBHMTFBOEcxOScgLT4gJzI0RzBHMTFBOEcxOE4wJw0KDQoNCiMjIEE5LiBBZ2FpbiB2YWxpZGF0ZSB0aGUgYmFtIGZpbGUNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGdhdGsgVmFsaWRhdGVTYW1GaWxlIC1SIEhvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhIC1JIEVSUjI1MDQwOV8xLm1kdXAuY2FsbWQuYmFtIC1NIFNVTU1BUlkgLU8gc3VtbWFyeV9FUlIyNTA0MDlfMS5tZHVwLmNhbG1kDQoNCg0KDQojIyBBMTAuIEluZGV4IHRoZSBlcnJvci1maXhlZCBCQU0gZmlsZQ0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgc2FtdG9vbHMgaW5kZXggRVJSMjUwNDA5XzEubWR1cC5jYWxtZC5iYW0gDQoNCg0KDQojIyBBMTEuIFJ1biBnYXRrIEhhcGxvdHlwZUNhbGxlcg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgZ2F0ayBIYXBsb3R5cGVDYWxsZXIgLVIgSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEgLUkgRVJSMjUwNDA5XzEubWR1cC5jYWxtZC5iYW0gLUwgY2hyMjA6MTUsODAwLDAwMC0xNiwxMDAsMDAwIC1PIEVSUjI1MDQwOV8xLm1kdXAuY2FsbWQudmNmDQoNClVzaW5nIEdBVEsgamFyIC9ob21lL2IwZDI2NDcvbWluaWNvbmRhMy9zaGFyZS9nYXRrNC00LjEuMi4wLTAvZ2F0ay1wYWNrYWdlLTQuMS4yLjAtbG9jYWwuamFyDQoNCg0KLi4uLi4uLi4uDQoNCiAgICAgICAgICAgICAgICAgIDExIHJlYWQocykgZmlsdGVyZWQgYnk6ICgoKE1hcHBpbmdRdWFsaXR5UmVhZEZpbHRlciBBTkQgTWFwcGluZ1F1YWxpdHlBdmFpbGFibGVSZWFkRmlsdGVyKSBBTkQgTWFwcGVkUmVhZEZpbHRlcikgQU5EIE5vdFNlY29uZGFyeUFsaWdubWVudFJlYWRGaWx0ZXIpDQogICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICA1IHJlYWQocykgZmlsdGVyZWQgYnk6ICgoTWFwcGluZ1F1YWxpdHlSZWFkRmlsdGVyIEFORCBNYXBwaW5nUXVhbGl0eUF2YWlsYWJsZVJlYWRGaWx0ZXIpIEFORCBNYXBwZWRSZWFkRmlsdGVyKQ0KICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICA1IHJlYWQocykgZmlsdGVyZWQgYnk6IChNYXBwaW5nUXVhbGl0eVJlYWRGaWx0ZXIgQU5EIE1hcHBpbmdRdWFsaXR5QXZhaWxhYmxlUmVhZEZpbHRlcikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1IHJlYWQocykgZmlsdGVyZWQgYnk6IE1hcHBpbmdRdWFsaXR5UmVhZEZpbHRlciANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIDYgcmVhZChzKSBmaWx0ZXJlZCBieTogTm90U2Vjb25kYXJ5QWxpZ25tZW50UmVhZEZpbHRlciANCiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgIDI5MSByZWFkKHMpIGZpbHRlcmVkIGJ5OiBOb3REdXBsaWNhdGVSZWFkRmlsdGVyIA0KICAgICAgICAgICAgICAgICAgDQowMDoxMDoyNy4wNTggSU5GTyAgUHJvZ3Jlc3NNZXRlciAtICAgICAgIGNocjIwOjE2MDk3MTY3ICAgICAgICAgICAgICAwLjAgICAgICAgICAgICAgICAgICAxMDE5ICAgICAgICAgIDY3MDM5LjUNCg0KMDA6MTA6MjcuMDU4IElORk8gIFByb2dyZXNzTWV0ZXIgLSBUcmF2ZXJzYWwgY29tcGxldGUuIFByb2Nlc3NlZCAxMDE5IHRvdGFsIHJlZ2lvbnMgaW4gMC4wIG1pbnV0ZXMuDQoNCg0KDQoNCg0KIyMgQTEyLiBHZW5lcmFyZSBzaG9ydCB2YXJpYW50IChpLmUuLCBTTlBzIGFuZCBpbmRlbHMpIHN0YXRpc3RpY3MNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGJjZnRvb2xzIHN0YXRzIEVSUjI1MDQwOV8xLm1kdXAuY2FsbWQudmNmDQoNCmBgYA0KIyBUaGlzIGZpbGUgd2FzIHByb2R1Y2VkIGJ5IGJjZnRvb2xzIHN0YXRzICgxLjkraHRzbGliLTEuOSkgYW5kIGNhbiBiZSBwbG90dGVkIHVzaW5nIHBsb3QtdmNmc3RhdHMuDQoNCi4uLi4uLi4uLi4uLi4uLi4NCg0KDQojIFNOICAgIFsyXWlkICAgWzNda2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs0XXZhbHVlDQoNClNOICAgICAgMCAgICAgICBudW1iZXIgb2Ygc2FtcGxlczogICAgICAgICAgICAgICAgICAgICAgMQ0KDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIHJlY29yZHM6ICAgICAgICAgICAgICAgICAgICAgIDYNCg0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBuby1BTFRzOiAgICAgICAgICAgICAgICAgICAgICAwDQoNClNOICAgICAgMCAgICAgICBudW1iZXIgb2YgU05QczogICAgICAgICAgICAgICAgICAgICAgICAgNg0KDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIE1OUHM6ICAgICAgICAgICAgICAgICAgICAgICAgIDANCg0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBpbmRlbHM6ICAgICAgICAgICAgICAgICAgICAgICAwDQoNClNOICAgICAgMCAgICAgICBudW1iZXIgb2Ygb3RoZXJzOiAgICAgICAgICAgICAgICAgICAgICAgMA0KDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIG11bHRpYWxsZWxpYyBzaXRlczogICAgICAgICAgIDANCg0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBtdWx0aWFsbGVsaWMgU05QIHNpdGVzOiAgICAgICAwIA0KDQpgYGANCg0KIyMgQTEzLiBBZGRpdGlvbmFsIGRpcmVjdG9yeSBjb250ZW50cw0KDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBscyAtbA0KDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgIDQwOTgzNDY0NzUgQXByIDI2IDIwOjI4IEVSUjI1MDQwOV8xLmJhbQ0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICA0ODYzOTI4IEFwciAyNiAyMDozMCBFUlIyNTA0MDlfMS5iYW0uYmFpDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgICAgICAgIDMzODggQXByIDI2IDIzOjAzIEVSUjI1MDQwOV8xLmR1cE1ldHJpY3MudHh0DQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgIDQ0NzM4MzE0OTkgQXByIDI2IDIzOjQ1IEVSUjI1MDQwOV8xLm1kdXAuY2FsbWQuYmFtDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgICAgIDQ5MjQ3ODQgQXByIDI3IDAwOjA2IEVSUjI1MDQwOV8xLm1kdXAuY2FsbWQuYmFtLmJhaQ0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICAgMTc2MjAxIEFwciAyNyAwMDoxMCBFUlIyNTA0MDlfMS5tZHVwLmNhbG1kLnZjZg0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICAgMTE0MTczIEFwciAyNyAwMDoxMCBFUlIyNTA0MDlfMS5tZHVwLmNhbG1kLnZjZi5pZHgNCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgICAgICAgICA3NSBBcHIgMjYgMjA6NTcgc3VtbWFyeV9FUlIyNTA0MDlfMQ0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICAgICAgIDE2IEFwciAyNiAyMzo1MiBzdW1tYXJ5X0VSUjI1MDQwOV8xX21kdXBfY2FsbWQNCg0KDQoNCiMjIEFMSUdOIEFORCBBTkFMWVpFIFRIRSAyTkQgUEFJUiBPRiBGQVNUUSBTRVFVRU5DRVMNCg0KDQojIyBCMS4gQWxpZ24gdGhlIDJuZCBwYWlyIG9mIGZhc3RxIHNlcXVlbmNlcyB0byB0aGUgcmVmZXJlbmNlIGdlbm9tZSB1c2luZyBCV0ENCg0KDQojIyMgRmFzdHEgZmlsZSBjb250ZW50cw0KDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCB6Y2F0IEVSUjI1MDQxMF8xLmZhc3RxLmd6IHwgaGVhZCAtbiAyDQoNCkBFUlIyNTA0MTAuMSBGQ0MxSEE4QUNYWDo1OjExMDE6MTEzNzoxOTg0LzENCg0KTlRHVEFBR1RUVFRUQ1RBR0dUVEFUQUNDQUNUVFRDQ0FHVEdBVEdBQ0FDVFRUVFRBVEFUVFRUR1RUQVRBVFRUVEFDVFRUQUFUVEdBQUdDQUFBR1RHVEdUVFRBVFRDQUFUQ0NBRw0KDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCB6Y2F0IEVSUjI1MDQxMF8yLmZhc3RxLmd6IHwgaGVhZCAtbiAyDQoNCkBFUlIyNTA0MTAuMSBGQ0MxSEE4QUNYWDo1OjExMDE6MTEzNzoxOTg0LzINCg0KR0dDR0FUQUFHQUFUVENDVFRUQ1RHQ0NUQ0NUVEdHQ1RBR0FHVFRHQUNBQ0NUQUFBQUFDQUFBR0FBQ0FDVEdHQVRUR0FBVEFBQUNBQ0FDVFRUR0NUVENBQVRUQUFBR1RBQUFBTg0KDQoNCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgYndhIG1lbSAtTSAtdCAyNCAtUiAnQFJHXHRJRDpFUlIyNTA0MTBcdExCOlpcdFBMOmlsbHVtaW5hXHRQVTpGQ0MxSEE4QUNYWFx0U006SEcwMjc1OScgSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEgRVJSMjUwNDEwXzEuZmFzdHEuZ3ogRVJSMjUwNDEwXzIuZmFzdHEuZ3ogfCBzYW10b29scyB2aWV3IC1TYmggfCBzYW10b29scyBzb3J0IC1vIEVSUjI1MDQxMF8xLmJhbSAtICYmIHNhbXRvb2xzIGluZGV4IEVSUjI1MDQxMF8xLmJhbSAmJiBzYW10b29scyBmbGFnc3RhdCBFUlIyNTA0MTBfMS5iYW0NCg0KDQpbbWFpbl0gVmVyc2lvbjogMC43LjE3LXIxMTg4DQoNClttYWluXSBSZWFsIHRpbWU6IDc0OS4zNDEgc2VjOyBDUFU6IDExMDU0LjYxMyBzZWMNCg0KW2JhbV9zb3J0X2NvcmVdIG1lcmdpbmcgZnJvbSAxOCBmaWxlcyBhbmQgMSBpbi1tZW1vcnkgYmxvY2tzLi4uDQoNCmBgYA0KNTAyMzY1MjEgKyAwIGluIHRvdGFsIChRQy1wYXNzZWQgcmVhZHMgKyBRQy1mYWlsZWQgcmVhZHMpDQoNCjY2OTA2ICsgMCBzZWNvbmRhcnkNCg0KMTQ1NDA5ICsgMCBzdXBwbGVtZW50YXJ5DQoNCjAgKyAwIGR1cGxpY2F0ZXMNCg0KNTAxMjk3MjQgKyAwIG1hcHBlZCAoOTkuNzklIDogTi9BKQ0KDQo1MDAyNDIwNiArIDAgcGFpcmVkIGluIHNlcXVlbmNpbmcNCg0KMjUwMTIxMDMgKyAwIHJlYWQxDQoNCjI1MDEyMTAzICsgMCByZWFkMg0KDQo0OTQwNzc3OCArIDAgcHJvcGVybHkgcGFpcmVkICg5OC43NyUgOiBOL0EpDQoNCjQ5ODExNjMyICsgMCB3aXRoIGl0c2VsZiBhbmQgbWF0ZSBtYXBwZWQNCg0KMTA1Nzc3ICsgMCBzaW5nbGV0b25zICgwLjIxJSA6IE4vQSkNCg0KMjU4MDU2ICsgMCB3aXRoIG1hdGUgbWFwcGVkIHRvIGEgZGlmZmVyZW50IGNocg0KDQoxOTQwMjcgKyAwIHdpdGggbWF0ZSBtYXBwZWQgdG8gYSBkaWZmZXJlbnQgY2hyIChtYXBRPj01KQ0KYGBgDQoNCiMjIEIyLiBWYWxpZGF0ZSB0aGUgQkFNIGZpbGUNCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgZ2F0ayBWYWxpZGF0ZVNhbUZpbGUgLVIgSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEgLUkgRVJSMjUwNDEwXzEuYmFtIC1NIFNVTU1BUlkgLU8gc3VtbWFyeV9FUlIyNTA0MTBfMQ0KDQpVc2luZyBHQVRLIGphciAvaG9tZS9iMGQyNjQ3L21pbmljb25kYTMvc2hhcmUvZ2F0azQtNC4xLjIuMC0wL2dhdGstcGFja2FnZS00LjEuMi4wLWxvY2FsLmphcg0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KDQpJTkZPICAgIDIwMTktMDQtMjcgMjM6MzM6MzQgICAgIFNhbUZpbGVWYWxpZGF0b3IgICAgICAgIFZhbGlkYXRlZCBSZWFkICAgIDEwLDAwMCwwMDAgcmVjb3Jkcy4gIEVsYXBzZWQgdGltZTogMDA6MDE6MzVzLiAgVGltZSBmb3IgbGFzdCAxMCwwMDAsMDAwOiAgIDk0cy4gIExhc3QgcmVhZCBwb3NpdGlvbjogY2hyMzo0OCw5NzQsNzg1DQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQoNCklORk8gICAgMjAxOS0wNC0yNyAyMzozOTo1NiAgICAgU2FtRmlsZVZhbGlkYXRvciAgICAgICAgVmFsaWRhdGVkIFJlYWQgICAgNTAsMDAwLDAwMCByZWNvcmRzLiAgRWxhcHNlZCB0aW1lOiAwMDowNzo1N3MuICBUaW1lIGZvciBsYXN0IDEwLDAwMCwwMDA6ICAgOThzLiAgTGFzdCByZWFkIHBvc2l0aW9uOiBjaHJVbl9HTDAwMDIyNHYxOjU1LDE3Mg0KDQoNCltTYXQgQXByIDI3IDIzOjQwOjU2IFVUQyAyMDE5XSBwaWNhcmQuc2FtLlZhbGlkYXRlU2FtRmlsZSBkb25lLiBFbGFwc2VkIHRpbWU6IDguOTggbWludXRlcy4NCg0KLi4uLi4uLi4uLi4uLi4uLi4NCg0KDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBjYXQgc3VtbWFyeV9FUlIyNTA0MTBfMSANCg0KYGBgDQojIyBISVNUT0dSQU0gICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nDQoNCkVycm9yIFR5cGUgICAgICAgICAgICAgIENvdW50DQoNCkVSUk9SOklOVkFMSURfVEFHX05NICAgIDEwNw0KDQpgYGANCg0KDQojIyBCMy4gRml4IHRoZSBlcnJvciANCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgc2FtdG9vbHMgY2FsbWQgLWJBciBFUlIyNTA0MTBfMS5iYW0gSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEgPiBFUlIyNTA0MTBfMS5jYWxtZC5iYW0NCg0KLi4uLi4uLi4uLi4uLi4uLg0KDQpbYmFtX2ZpbGxtZDFdIGRpZmZlcmVudCBNRCBmb3IgcmVhZCAnRVJSMjUwNDEwLjEzMTA3NjcnOiAnOTlHMCcgLT4gJzk5TjAnDQoNCltiYW1fZmlsbG1kMV0gZGlmZmVyZW50IE5NIGZvciByZWFkICdFUlIyNTA0MTAuMjI3NzA0NTEnOiAzIC0+IDQNCg0KW2JhbV9maWxsbWQxXSBkaWZmZXJlbnQgTUQgZm9yIHJlYWQgJ0VSUjI1MDQxMC4yMjc3MDQ1MSc6ICczNFQyOVQxQTE5JyAtPiAnMzRUMjlUMUExOE4wJw0KDQoNCiMjIEI0LiBWYWxpZGF0ZSBhZ2FpbiBhZnRlciB0aGUgZml4DQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBnYXRrIFZhbGlkYXRlU2FtRmlsZSAtUiBIb21vX3NhcGllbnNfYXNzZW1ibHkzOC5mYXN0YSAtSSBFUlIyNTA0MTBfMS5jYWxtZC5iYW0gLU0gU1VNTUFSWSAtTyBzdW1tYXJ5X0VSUjI1MDQxMF8xX2NhbG1kDQoNClVzaW5nIEdBVEsgamFyIC9ob21lL2IwZDI2NDcvbWluaWNvbmRhMy9zaGFyZS9nYXRrNC00LjEuMi4wLTAvZ2F0ay1wYWNrYWdlLTQuMS4yLjAtbG9jYWwuamFyDQoNCi4uLi4uLi4uLi4NCg0KSU5GTyAgICAyMDE5LTA0LTI4IDAwOjQ1OjM2ICAgICBTYW1GaWxlVmFsaWRhdG9yICAgICAgICBWYWxpZGF0ZWQgUmVhZCAgICA1MCwwMDAsMDAwIHJlY29yZHMuICBFbGFwc2VkIHRpbWU6IDAwOjA1OjUxcy4gVGltZSBmb3IgbGFzdCAxMCwwMDAsMDAwOiAgIDcwcy4gIExhc3QgcmVhZCBwb3NpdGlvbjogY2hyVW5fR0wwMDAyMjR2MTo1NSwxNzINCg0KW1N1biBBcHIgMjggMDA6NDU6MzkgVVRDIDIwMTldIHBpY2FyZC5zYW0uVmFsaWRhdGVTYW1GaWxlIGRvbmUuIEVsYXBzZWQgdGltZTogNS45MSBtaW51dGVzLg0KDQouLi4uDQoNClRvb2wgcmV0dXJuZWQ6IDANCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgY2F0IHN1bW1hcnlfRVJSMjUwNDEwXzFfY2FsbWQgDQoNCk5vIGVycm9ycyBmb3VuZA0KDQoNCg0KIyMgQjUuIE1hcmsgRHVwbGljYXRlcyBvbiB0aGUgZXJyb3ItZml4ZWQgYmFtIGZpbGUNCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgZ2F0ayBNYXJrRHVwbGljYXRlcyAtSSBFUlIyNTA0MTBfMS5jYWxtZC5iYW0gLU8gRVJSMjUwNDEwXzEuY2FsbWQubWR1cC5iYW0gLU0gRVJSMjUwNDEwXzEuY2FsbWQuZHVwTWV0cmljcy50eHQNCg0KLi4uLi4uLi4uLi4uDQoNCklORk8gICAgMjAxOS0wNC0yOCAwMjoyODoxOCAgICAgU29ydGluZ0NvbGxlY3Rpb24gICAgICAgQ3JlYXRpbmcgbWVyZ2luZyBpdGVyYXRvciBmcm9tIDIgZmlsZXMNCg0KLi4uLi4uLi4uLi4uLi4uLi4uDQoNCklORk8gICAgMjAxOS0wNC0yOCAwMjoyODozMyAgICAgTWFya0R1cGxpY2F0ZXMgIE1hcmtpbmcgNjAxNzIyNSByZWNvcmRzIGFzIGR1cGxpY2F0ZXMuDQoNCklORk8gICAgMjAxOS0wNC0yOCAwMjoyODozMyAgICAgTWFya0R1cGxpY2F0ZXMgIEZvdW5kIDAgb3B0aWNhbCBkdXBsaWNhdGUgY2x1c3RlcnMuDQoNCklORk8gICAgMjAxOS0wNC0yOCAwMjoyODozMyAgICAgTWFya0R1cGxpY2F0ZXMgIFJlYWRzIGFyZSBhc3N1bWVkIHRvIGJlIG9yZGVyZWQgYnk6IGNvb3JkaW5hdGUNCg0KSU5GTyAgICAyMDE5LTA0LTI4IDAyOjI5OjE2ICAgICBNYXJrRHVwbGljYXRlcyAgV3JpdHRlbiAgICAxMCwwMDAsMDAwIHJlY29yZHMuICBFbGFwc2VkIHRpbWU6IDAwOjAwOjQycy4gIFRpbWUgZm9yIGxhc3QgMTAsMDAwLDAwMDogICA0MnMuICBMYXN0IHJlYWQNCiBwb3NpdGlvbjogY2hyMzo0OCw5NzQsNzg1DQogDQouLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KIA0KIA0KSU5GTyAgICAyMDE5LTA0LTI4IDAyOjMyOjEzICAgICBNYXJrRHVwbGljYXRlcyAgV3JpdHRlbiAgICA1MCwwMDAsMDAwIHJlY29yZHMuICBFbGFwc2VkIHRpbWU6IDAwOjAzOjM5cy4gIFRpbWUgZm9yIGxhc3QgMTAsMDAwLDAwMDogICA0NXMuICBMYXN0IHJlYWQNCiBwb3NpdGlvbjogY2hyVW5fR0wwMDAyMjR2MTo1NSwxNzINCiANCg0KDQpbU3VuIEFwciAyOCAwMjozMjoxNSBVVEMgMjAxOV0gcGljYXJkLnNhbS5tYXJrZHVwbGljYXRlcy5NYXJrRHVwbGljYXRlcyBkb25lLiBFbGFwc2VkIHRpbWU6IDExLjE3IG1pbnV0ZXMuDQoNCg0KDQojIyBCNi4gSW5kZXggdGhlIEJBTSBmaWxlDQoNCg0KIyMjIyBzYW10b29scyBpbmRleCBFUlIyNTA0MTBfMS5jYWxtZC5tZHVwLmJhbQ0KDQoNCg0KIyMgQjcuIFJ1biBnYXRrIEhhcGxvdHlwZUNhbGxlciANCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGdhdGsgSGFwbG90eXBlQ2FsbGVyIC1SIEhvbW9fc2FwaWVuc19hc3NlbWJseTM4LmZhc3RhIC1JIEVSUjI1MDQxMF8xLmNhbG1kLm1kdXAuYmFtIC1MIGNocjIwOjE1LDgwMCwwMDAtMTYsMTAwLDAwMCAtTyBFUlIyNTA0MTBfMS5jYWxtZC5tZHVwLnZjZg0KDQpVc2luZyBHQVRLIGphciAvaG9tZS9iMGQyNjQ3L21pbmljb25kYTMvc2hhcmUvZ2F0azQtNC4xLjIuMC0wL2dhdGstcGFja2FnZS00LjEuMi4wLWxvY2FsLmphcg0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQowMjo0Mzo1MS4zMzAgSU5GTyAgSGFwbG90eXBlQ2FsbGVyIC0gDQoNCmBgYA0KMjM5IHJlYWQocykgZmlsdGVyZWQgYnk6ICgoKCgoKCgoTWFwcGluZ1F1YWxpdHlSZWFkRmlsdGVyIEFORCBNYXBwaW5nUXVhbGl0eUF2YWlsYWJsZVJlYWRGaWx0ZXIpIEFORCBNYXBwZWRSZWFkRmlsdGVyKSBBTkQgTm90U2Vjb25kYXJ5QWxpZ25tZW50UmVhZEZpbHRlcikgQU5EIE5vdER1cGxpY2F0ZVJlYWRGaWx0ZXIpIEFORCBQYXNzZXNWZW5kb3JRdWFsaXR5Q2hlY2tSZWFkRmlsdGVyKSBBTkQgTm9uWmVyb1JlZmVyZW5jZUxlbmd0aEFsaWdubWVudFJlYWRGaWx0ZXIpIEFORCBHb29kQ2lnYXJSZWFkRmlsdGVyKSBBTkQgV2VsbGZvcm1lZFJlYWRGaWx0ZXIpDQoNCiAgMjM5IHJlYWQocykgZmlsdGVyZWQgYnk6ICgoKCgoKChNYXBwaW5nUXVhbGl0eVJlYWRGaWx0ZXIgQU5EIE1hcHBpbmdRdWFsaXR5QXZhaWxhYmxlUmVhZEZpbHRlcikgQU5EIE1hcHBlZFJlYWRGaWx0ZXIpIEFORCBOb3RTZWNvbmRhcnlBbGlnbm1lbnRSZWFkRmlsdGVyKSBBTkQgTm90RHVwbGljYXRlUmVhZEZpbHRlcikgQU5EIFBhc3Nlc1ZlbmRvclF1YWxpdHlDaGVja1JlYWRGaWx0ZXIpIEFORCBOb25aZXJvUmVmZXJlbmNlTGVuZ3RoQWxpZ25tZW50UmVhZEZpbHRlcikgQU5EIEdvb2RDaWdhclJlYWRGaWx0ZXIpDQogICAgICANCiAgICAgIDIzOSByZWFkKHMpIGZpbHRlcmVkIGJ5OiAoKCgoKChNYXBwaW5nUXVhbGl0eVJlYWRGaWx0ZXIgQU5EIE1hcHBpbmdRdWFsaXR5QXZhaWxhYmxlUmVhZEZpbHRlcikgQU5EIE1hcHBlZFJlYWRGaWx0ZXIpIEFORCBOb3RTZWNvbmRhcnlBbGlnbm1lbnRSZWFkRmlsdGVyKSBBTkQgTm90RHVwbGljYXRlUmVhZEZpbHRlcikgQU5EIFBhc3Nlc1ZlbmRvclF1YWxpdHlDaGVja1JlYWRGaWx0ZXIpIEFORCBOb25aZXJvUmVmZXJlbmNlTGVuZ3RoQWxpZ25tZW50UmVhZEZpbHRlcikNCiAgICAgICAgICANCiAgICAgICAgICAyMzkgcmVhZChzKSBmaWx0ZXJlZCBieTogKCgoKChNYXBwaW5nUXVhbGl0eVJlYWRGaWx0ZXIgQU5EIE1hcHBpbmdRdWFsaXR5QXZhaWxhYmxlUmVhZEZpbHRlcikgQU5EIE1hcHBlZFJlYWRGaWx0ZXIpIEFORCBOb3RTZWNvbmRhcnlBbGlnbm1lbnRSZWFkRmlsdGVyKSBBTkQgTm90RHVwbGljYXRlUmVhZEZpbHRlcikgQU5EIFBhc3Nlc1ZlbmRvclF1YWxpdHlDaGVja1JlYWRGaWx0ZXIpDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAyMzkgcmVhZChzKSBmaWx0ZXJlZCBieTogKCgoKE1hcHBpbmdRdWFsaXR5UmVhZEZpbHRlciBBTkQgTWFwcGluZ1F1YWxpdHlBdmFpbGFibGVSZWFkRmlsdGVyKSBBTkQgTWFwcGVkUmVhZEZpbHRlcikgQU5EIE5vdFNlY29uZGFyeUFsaWdubWVudFJlYWRGaWx0ZXIpIEFORCBOb3REdXBsaWNhdGVSZWFkRmlsdGVyKQ0KICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAxNCByZWFkKHMpIGZpbHRlcmVkIGJ5OiAoKChNYXBwaW5nUXVhbGl0eVJlYWRGaWx0ZXIgQU5EIE1hcHBpbmdRdWFsaXR5QXZhaWxhYmxlUmVhZEZpbHRlcikgQU5EIE1hcHBlZFJlYWRGaWx0ZXIpIEFORCBOb3RTZWNvbmRhcnlBbGlnbm1lbnRSZWFkRmlsdGVyKQ0KICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIDEwIHJlYWQocykgZmlsdGVyZWQgYnk6ICgoTWFwcGluZ1F1YWxpdHlSZWFkRmlsdGVyIEFORCBNYXBwaW5nUXVhbGl0eUF2YWlsYWJsZVJlYWRGaWx0ZXIpIEFORCBNYXBwZWRSZWFkRmlsdGVyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgcmVhZChzKSBmaWx0ZXJlZCBieTogKE1hcHBpbmdRdWFsaXR5UmVhZEZpbHRlciBBTkQgTWFwcGluZ1F1YWxpdHlBdmFpbGFibGVSZWFkRmlsdGVyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCByZWFkKHMpIGZpbHRlcmVkIGJ5OiBNYXBwaW5nUXVhbGl0eVJlYWRGaWx0ZXIgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICA0IHJlYWQocykgZmlsdGVyZWQgYnk6IE5vdFNlY29uZGFyeUFsaWdubWVudFJlYWRGaWx0ZXIgDQogICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAyMjUgcmVhZChzKSBmaWx0ZXJlZCBieTogTm90RHVwbGljYXRlUmVhZEZpbHRlcg0KYGBgDQogICAgICAgICAgICAgICAgICANCjAyOjQzOjUxLjMzMCBJTkZPICBQcm9ncmVzc01ldGVyIC0gICAgICAgY2hyMjA6MTYwOTc0MzQgICAgICAgICAgICAgIDAuMCAgICAgICAgICAgICAgICAgIDEwMTggICAgICAgICAgNjYxMDMuOQ0KDQowMjo0Mzo1MS4zMzEgSU5GTyAgUHJvZ3Jlc3NNZXRlciAtIFRyYXZlcnNhbCBjb21wbGV0ZS4gUHJvY2Vzc2VkIDEwMTggdG90YWwgcmVnaW9ucyBpbiAwLjAgbWludXRlcy4NCg0KLi4uLi4uLi4uLi4uDQoNCg0KDQojIyBCOC4gUmVwb3J0IHRoZSBzaG9ydCB2YXJpbmF0cyAoU05QcyBhbmQgaW5kZWxzKQ0KDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBiY2Z0b29scyBzdGF0cyBFUlIyNTA0MTBfMS5jYWxtZC5tZHVwLnZjZg0KDQoNCmBgYA0KDQojIFRoaXMgZmlsZSB3YXMgcHJvZHVjZWQgYnkgYmNmdG9vbHMgc3RhdHMgKDEuOStodHNsaWItMS45KSBhbmQgY2FuIGJlIHBsb3R0ZWQgdXNpbmcgcGxvdC12Y2ZzdGF0cy4NCg0KDQojIFRoZSBjb21tYW5kIGxpbmUgd2FzOiBiY2Z0b29scyBzdGF0cyAgRVJSMjUwNDEwXzEuY2FsbWQubWR1cC52Y2YNCg0KLi4uLi4uLi4uLi4uDQoNCiMgU04gICAgWzJdaWQgICBbM11rZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzRddmFsdWUNClNOICAgICAgMCAgICAgICBudW1iZXIgb2Ygc2FtcGxlczogICAgICAgICAgICAgICAgICAgICAgMQ0KU04gICAgICAwICAgICAgIG51bWJlciBvZiByZWNvcmRzOiAgICAgICAgICAgICAgICAgICAgICAzDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIG5vLUFMVHM6ICAgICAgICAgICAgICAgICAgICAgIDANClNOICAgICAgMCAgICAgICBudW1iZXIgb2YgU05QczogICAgICAgICAgICAgICAgICAgICAgICAgMw0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBNTlBzOiAgICAgICAgICAgICAgICAgICAgICAgICAwDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIGluZGVsczogICAgICAgICAgICAgICAgICAgICAgIDANClNOICAgICAgMCAgICAgICBudW1iZXIgb2Ygb3RoZXJzOiAgICAgICAgICAgICAgICAgICAgICAgMA0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBtdWx0aWFsbGVsaWMgc2l0ZXM6ICAgICAgICAgICAwDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIG11bHRpYWxsZWxpYyBTTlAgc2l0ZXM6ICAgICAgIDANCg0KYGBgDQoNCg0KIyMgQjkuIEFkZGl0aW9uYWwgZGlyZWN0b3J5IGNvbnRlbnRzDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBscyAtbA0KDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgIDQwNTE0NDI4MTYgQXByIDI3IDIzOjI1IEVSUjI1MDQxMF8xLmJhbQ0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICA0ODU3OTA0IEFwciAyNyAyMzoyNSBFUlIyNTA0MTBfMS5iYW0uYmFpDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgIDQzNzU1NjA2MjggQXByIDI4IDAwOjM2IEVSUjI1MDQxMF8xLmNhbG1kLmJhbQ0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICAgICAzNDA1IEFwciAyOCAwMjozMiBFUlIyNTA0MTBfMS5jYWxtZC5kdXBNZXRyaWNzLnR4dA0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICA1OTYxNTIyOTM4IEFwciAyOCAwMjozMiBFUlIyNTA0MTBfMS5jYWxtZC5tZHVwLmJhbQ0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICA1MDMxNjY0IEFwciAyOCAwMjozNyBFUlIyNTA0MTBfMS5jYWxtZC5tZHVwLmJhbS5iYWkNCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgICAgIDE3NTY2MyBBcHIgMjggMDI6NDMgRVJSMjUwNDEwXzEuY2FsbWQubWR1cC52Y2YNCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgICAgIDExNDE3MyBBcHIgMjggMDI6NDMgRVJSMjUwNDEwXzEuY2FsbWQubWR1cC52Y2YuaWR4DQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgICAgICAgICAgNzUgQXByIDI3IDIzOjQwIHN1bW1hcnlfRVJSMjUwNDEwXzENCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgICAgICAgICAxNiBBcHIgMjggMDA6NDUgc3VtbWFyeV9FUlIyNTA0MTBfMV9jYWxtZA0KDQoNCg0KDQoNCg0KIyMgQ29tYmluZSBib3RoIGJhbSBmaWxlcyBhbmQgYW5hbHl6ZSBmb3Igc2hvcnQgdmFyaWFudCBkaXNjb3ZlcnkNCg0KDQoNCiMjIEMxLiBNZXJnZSB0aGUgQkFNIGZpbGVzDQoNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGdhdGsgTWVyZ2VTYW1GaWxlcyAtSSBFUlIyNTA0MDlfMS5tZHVwLmNhbG1kLmJhbSAtSSBFUlIyNTA0MTBfMS5jYWxtZC5iYW0gLU8gRVJSMjUwNDA5MTAuY2FsbWQuYmFtDQoNCi4uLi4uLi4uLi4uLg0KDQpJTkZPICAgIDIwMTktMDQtMjggMDE6MjI6MzAgICAgIE1lcmdlU2FtRmlsZXMgICBQcm9jZXNzZWQgICAxMDEsMDAwLDAwMCByZWNvcmRzLiAgRWxhcHNlZCB0aW1lOiAwMDowNjozOHMuICBUaW1lIGZvciBsYXN0IDEsMDAwLDAwMDogICAgNXMuICBMYXN0IHJlYWQgcG9zaXRpb246IGNoclVuX0pURkgwMTAwMDAxN3YxX2RlY295OjIsNTA3DQoNCklORk8gICAgMjAxOS0wNC0yOCAwMToyMjozMSAgICAgTWVyZ2VTYW1GaWxlcyAgIEZpbmlzaGVkIHJlYWRpbmcgaW5wdXRzLg0KDQpbU3VuIEFwciAyOCAwMToyMjozMSBVVEMgMjAxOV0gcGljYXJkLnNhbS5NZXJnZVNhbUZpbGVzIGRvbmUuIEVsYXBzZWQgdGltZTogNi42NiBtaW51dGVzLg0KDQoNCg0KIyMgQzIuIE1hcmsgZHVwbGljYXRlcw0KDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBnYXRrIE1hcmtEdXBsaWNhdGVzIC1JIEVSUjI1MDQwOTEwLmNhbG1kLmJhbSAtTyBFUlIyNTA0MDkxMC5jYWxtZC5tZHVwLmJhbSAtTSBFUlIyNTA0MDkxMC5jYWxtZC5kdXBNZXRyaWNzLnR4dA0KDQoNCklORk8gICAgMjAxOS0wNC0yOCAwMTo0Njo0MyAgICAgTWFya0R1cGxpY2F0ZXMgIFJlYWQgMTAxMDQ1NjMxIHJlY29yZHMuIDAgcGFpcnMgbmV2ZXIgbWF0Y2hlZC4NCg0KLi4uLi4uLi4uLi4uLi4uLi4NCg0KSU5GTyAgICAyMDE5LTA0LTI4IDAxOjQ3OjE3ICAgICBNYXJrRHVwbGljYXRlcyAgV2lsbCByZXRhaW4gdXAgdG8gMjM2NjY2ODgwIGR1cGxpY2F0ZSBpbmRpY2VzIGJlZm9yZSBzcGlsbGluZyB0byBkaXNrLg0KDQouLi4uLi4uLi4uLi4uLg0KDQpJTkZPICAgIDIwMTktMDQtMjggMDE6NDc6MTggICAgIFNvcnRpbmdDb2xsZWN0aW9uICAgICAgIENyZWF0aW5nIG1lcmdpbmcgaXRlcmF0b3IgZnJvbSAyIGZpbGVzDQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KSU5GTyAgICAyMDE5LTA0LTI4IDAxOjQ3OjQwICAgICBTb3J0aW5nQ29sbGVjdGlvbiAgICAgICBDcmVhdGluZyBtZXJnaW5nIGl0ZXJhdG9yIGZyb20gNCBmaWxlcw0KDQouLi4uLi4uLi4uLi4uDQoNCklORk8gICAgMjAxOS0wNC0yOCAwMTo0ODoxMSAgICAgTWFya0R1cGxpY2F0ZXMgIE1hcmtpbmcgMjIwNjg0MDAgcmVjb3JkcyBhcyBkdXBsaWNhdGVzLg0KDQpJTkZPICAgIDIwMTktMDQtMjggMDE6NDg6MTEgICAgIE1hcmtEdXBsaWNhdGVzICBGb3VuZCAwIG9wdGljYWwgZHVwbGljYXRlIGNsdXN0ZXJzLg0KDQpJTkZPICAgIDIwMTktMDQtMjggMDE6NDg6MTEgICAgIE1hcmtEdXBsaWNhdGVzICBSZWFkcyBhcmUgYXNzdW1lZCB0byBiZSBvcmRlcmVkIGJ5OiBjb29yZGluYXRlDQoNCklORk8gICAgMjAxOS0wNC0yOCAwMTo0ODo1MyAgICAgTWFya0R1cGxpY2F0ZXMgIFdyaXR0ZW4gICAgMTAsMDAwLDAwMCByZWNvcmRzLiAgRWxhcHNlZCB0aW1lOiAwMDowMDo0MXMuICBUaW1lIGZvciBsYXN0IDEwLDAwMCwwMDA6ICAgNDFzLiAgTGFzdCByZWFkIHBvc2l0aW9uOiBjaHIxOjIzNiw1NDgsMjY1DQoNCi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4NCg0KDQpJTkZPICAgIDIwMTktMDQtMjggMDE6NTU6MTggICAgIE1hcmtEdXBsaWNhdGVzICBXcml0dGVuICAgMTAwLDAwMCwwMDAgcmVjb3Jkcy4gIEVsYXBzZWQgdGltZTogMDA6MDc6MDZzLiAgVGltZSBmb3IgbGFzdCAxMCwwMDAsMDAwOiAgIDQzcy4gIExhc3QgcmVhZCBwb3NpdGlvbjogY2hyWToxMiw5MTUsODU5DQoNCi4uLi4uLi4uLi4uDQoNCg0KIyMgQzMuIFZhbGlkYXRlIHRoZSBCQU0gZmlsZSBhZ2FpbiBhZnRlciBtZXJnaW5nIGFuZCBtYXJraW5nIGR1cGxpY2F0ZXMNCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgZ2F0ayBWYWxpZGF0ZVNhbUZpbGUgLVIgSG9tb19zYXBpZW5zX2Fzc2VtYmx5MzguZmFzdGEgLUkgRVJSMjUwNDA5MTAuY2FsbWQubWR1cC5iYW0gLU0gIFNVTU1BUlkgLU8gc3VtbWFyeV9FUlIyNTA0MDkxMC5jYWxtZC5tZHVwDQogDQpVc2luZyBHQVRLIGphciAvaG9tZS9iMGQyNjQ3L21pbmljb25kYTMvc2hhcmUvZ2F0azQtNC4xLjIuMC0wL2dhdGstcGFja2FnZS00LjEuMi4wLWxvY2FsLmphcg0KDQouLi4uLi4uLi4uLi4uLi4uLi4uDQoNClRvb2wgcmV0dXJuZWQ6MA0KDQoNCg0KIyMjIyB+L2dhdGstZGF0YS1yZWYkIGNhdCBzdW1tYXJ5X0VSUjI1MDQwOTEwLmNhbG1kLm1kdXAgDQoNCk5vIGVycm9ycyBmb3VuZA0KDQoNCg0KIyMgQzQuIEluZGV4IHRoZSBiYW0gZmlsZQ0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgc2FtdG9vbHMgaW5kZXggRVJSMjUwNDA5MTAuY2FsbWQubWR1cC5iYW0NCg0KDQojIyBDNS4gUnVuIEhhcGxvdHlwZWNhbGxlcg0KDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBnYXRrIEhhcGxvdHlwZUNhbGxlciAtUiBIb21vX3NhcGllbnNfYXNzZW1ibHkzOC5mYXN0YSAtSSBFUlIyNTA0MDkxMC5jYWxtZC5tZHVwLmJhbSAtTCBjaHIyMDoxNSw4MDAsMDAwLTE2LDEwMCwwMDAgLU8gRVJSMjUwNDA5MTAuY2FsbWQubWR1cC52Y2YNCg0KVXNpbmcgR0FUSyBqYXIgL2hvbWUvYjBkMjY0Ny9taW5pY29uZGEzL3NoYXJlL2dhdGs0LTQuMS4yLjAtMC9nYXRrLXBhY2thZ2UtNC4xLjIuMC1sb2NhbC5qYXINCg0KDQowMjozNTowOC45NTIgSU5GTyAgSGFwbG90eXBlQ2FsbGVyIC0gDQoNCmBgYA0KOTYyIHJlYWQocykgZmlsdGVyZWQgYnk6ICgoKCgoKCgoTWFwcGluZ1F1YWxpdHlSZWFkRmlsdGVyIEFORCBNYXBwaW5nUXVhbGl0eUF2YWlsYWJsZVJlYWRGaWx0ZXIpIEFORCBNYXBwZWRSZWFkRmlsdGVyKSBBTkQgTm90U2Vjb25kYXJ5QWxpZ25tZW50UmVhZEZpbHRlcikgQU5EIE5vdER1cGxpY2F0ZVJlYWRGaWx0ZXIpIEFORCBQYXNzZXNWZW5kb3JRdWFsaXR5Q2hlY2tSZWFkRmlsdGVyKSBBTkQgTm9uWmVyb1JlZmVyZW5jZUxlbmd0aEFsaWdubWVudFJlYWRGaWx0ZXIpIEFORCBHb29kQ2lnYXJSZWFkRmlsdGVyKSBBTkQgV2VsbGZvcm1lZFJlYWRGaWx0ZXIpDQogIA0KICA5NjIgcmVhZChzKSBmaWx0ZXJlZCBieTogKCgoKCgoKE1hcHBpbmdRdWFsaXR5UmVhZEZpbHRlciBBTkQgTWFwcGluZ1F1YWxpdHlBdmFpbGFibGVSZWFkRmlsdGVyKSBBTkQgTWFwcGVkUmVhZEZpbHRlcikgQU5EIE5vdFNlICBjb25kYXJ5QWxpZ25tZW50UmVhZEZpbHRlcikgQU5EIE5vdER1cGxpY2F0ZVJlYWRGaWx0ZXIpIEFORCBQYXNzZXNWZW5kb3JRdWFsaXR5Q2hlY2tSZWFkRmlsdGVyKSBBTkQgTm9uWmVyb1JlZmVyZW5jZUxlbmd0aEFsaWdubWVudFJlYWRGaWx0ZXIpIEFORCBHb29kQ2lnYXJSZWFkRmlsdGVyKQ0KICAgICAgDQogICAgICA5NjIgcmVhZChzKSBmaWx0ZXJlZCBieTogKCgoKCgoTWFwcGluZ1F1YWxpdHlSZWFkRmlsdGVyIEFORCBNYXBwaW5nUXVhbGl0eUF2YWlsYWJsZVJlYWRGaWx0ZXIpIEFORCBNYXBwZWRSZWFkRmlsdGVyKSBBTkQgTm90U2Vjb25kYXJ5QWxpZ25tZW50UmVhZEZpbHRlcikgQU5EIE5vdER1cGxpY2F0ZVJlYWRGaWx0ZXIpIEFORCBQYXNzZXNWZW5kb3JRdWFsaXR5Q2hlY2tSZWFkRmlsdGVyKSBBTkQgTm9uWmVyb1JlZmVyZW5jZUxlbmd0aEFsaWdubWVudFJlYWRGaWx0ZXIpDQogICAgICAgICAgDQogICAgICAgICAgOTYyIHJlYWQocykgZmlsdGVyZWQgYnk6ICgoKCgoTWFwcGluZ1F1YWxpdHlSZWFkRmlsdGVyIEFORCBNYXBwaW5nUXVhbGl0eUF2YWlsYWJsZVJlYWRGaWx0ZXIpIEFORCBNYXBwZWRSZWFkRmlsdGVyKSBBTkQgTm90U2Vjb25kYXJ5QWxpZ25tZW50UmVhZEZpbHRlcikgQU5EIE5vdER1cGxpY2F0ZVJlYWRGaWx0ZXIpIEFORCBQYXNzZXNWZW5kb3JRdWFsaXR5Q2hlY2tSZWFkRmlsdGVyKQ0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgOTYyIHJlYWQocykgZmlsdGVyZWQgYnk6ICgoKChNYXBwaW5nUXVhbGl0eVJlYWRGaWx0ZXIgQU5EIE1hcHBpbmdRdWFsaXR5QXZhaWxhYmxlUmVhZEZpbHRlcikgQU5EIE1hcHBlZFJlYWRGaWx0ZXIpQU5EIE5vdFNlY29uZGFyeUFsaWdubWVudFJlYWRGaWx0ZXIpIEFORCBOb3REdXBsaWNhdGVSZWFkRmlsdGVyKQ0KICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAyNSByZWFkKHMpIGZpbHRlcmVkIGJ5OiAoKChNYXBwaW5nUXVhbGl0eVJlYWRGaWx0ZXIgQU5EIE1hcHBpbmdRdWFsaXR5QXZhaWxhYmxlUmVhZEZpbHRlcikgQU5EIE1hcHBlZFJlYWRGaWx0ZXIpIEFORCBOb3RTZWNvbmRhcnlBbGlnbm1lbnRSZWFkRmlsdGVyKQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAxNSByZWFkKHMpIGZpbHRlcmVkIGJ5OiAoKE1hcHBpbmdRdWFsaXR5UmVhZEZpbHRlciBBTkQgTWFwcGluZ1F1YWxpdHlBdmFpbGFibGVSZWFkRmlsdGVyKSBBTkQgTWFwcGVkUmVhZEZpbHRlcikNCiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgMTUgcmVhZChzKSBmaWx0ZXJlZCBieTogKE1hcHBpbmdRdWFsaXR5UmVhZEZpbHRlciBBTkQgTWFwcGluZ1F1YWxpdHlBdmFpbGFibGVSZWFkRmlsdGVyKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSByZWFkKHMpIGZpbHRlcmVkIGJ5OiBNYXBwaW5nUXVhbGl0eVJlYWRGaWx0ZXIgDQogICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgMTAgcmVhZChzKSBmaWx0ZXJlZCBieTogTm90U2Vjb25kYXJ5QWxpZ25tZW50UmVhZEZpbHRlciANCiAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgOTM3IHJlYWQocykgZmlsdGVyZWQgYnk6IE5vdER1cGxpY2F0ZVJlYWRGaWx0ZXIgDQpgYGANCiAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgDQowMjozNTowOC45NTMgSU5GTyAgUHJvZ3Jlc3NNZXRlciAtICAgICAgIGNocjIwOjE2MDk3NzM0ICAgICAgICAgICAgICAwLjAgICAgICAgICAgICAgICAgICAxMDI3ICAgICAgICAgIDQ4MzY3LjMNCg0KMDI6MzU6MDguOTUzIElORk8gIFByb2dyZXNzTWV0ZXIgLSBUcmF2ZXJzYWwgY29tcGxldGUuIFByb2Nlc3NlZCAxMDI3IHRvdGFsIHJlZ2lvbnMgaW4gMC4wIG1pbnV0ZXMuDQoNCg0KDQojIyBDNi4gUmVwb3J0IHNob3J0IHZhcmlhbnQgKFNOUHMgYW5kIGluZGVscykgc3RhdGlzdGljcyANCg0KDQojIyMjIH4vZ2F0ay1kYXRhLXJlZiQgYmNmdG9vbHMgc3RhdHMgRVJSMjUwNDA5MTAuY2FsbWQubWR1cC52Y2YNCg0KYGBgDQojIFRoaXMgZmlsZSB3YXMgcHJvZHVjZWQgYnkgYmNmdG9vbHMgc3RhdHMgKDEuOStodHNsaWItMS45KSBhbmQgY2FuIGJlIHBsb3R0ZWQgdXNpbmcgcGxvdC12Y2ZzdGF0cy4NCg0KDQouLi4uLi4uLi4uLi4uLi4uLi4uLg0KDQoNCiMgU04gICAgWzJdaWQgICBbM11rZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzRddmFsdWUNCg0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBzYW1wbGVzOiAgICAgICAgICAgICAgICAgICAgICAxDQoNClNOICAgICAgMCAgICAgICBudW1iZXIgb2YgcmVjb3JkczogICAgICAgICAgICAgICAgICAgICAgOA0KDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIG5vLUFMVHM6ICAgICAgICAgICAgICAgICAgICAgIDANCg0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBTTlBzOiAgICAgICAgICAgICAgICAgICAgICAgICA4DQoNClNOICAgICAgMCAgICAgICBudW1iZXIgb2YgTU5QczogICAgICAgICAgICAgICAgICAgICAgICAgMA0KDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIGluZGVsczogICAgICAgICAgICAgICAgICAgICAgIDANCg0KU04gICAgICAwICAgICAgIG51bWJlciBvZiBvdGhlcnM6ICAgICAgICAgICAgICAgICAgICAgICAwDQoNClNOICAgICAgMCAgICAgICBudW1iZXIgb2YgbXVsdGlhbGxlbGljIHNpdGVzOiAgICAgICAgICAgMA0KDQpTTiAgICAgIDAgICAgICAgbnVtYmVyIG9mIG11bHRpYWxsZWxpYyBTTlAgc2l0ZXM6ICAgICAgIDANCg0KYGBgDQoNCg0KIyMgQzcuIEFkZGl0aW9uYWwgZGlyZWN0b3J5IGNvbnRlbnRzDQoNCiMjIyMgfi9nYXRrLWRhdGEtcmVmJCBscyAtbA0KDQoNCi1ydy1ydy1yLS0gMSBiMGQyNjQ3IGIwZDI2NDcgMTE4MjA0NTQwOTQgQXByIDI4IDAxOjIyIEVSUjI1MDQwOTEwLmNhbG1kLmJhbQ0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICAgICAzNDMxIEFwciAyOCAwMTo1NSBFUlIyNTA0MDkxMC5jYWxtZC5kdXBNZXRyaWNzLnR4dA0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICAgMTc2NjUxIEFwciAyOCAwMjozNSBFUlIyNTA0MDkxMC5jYWxtZC5tZHVwLnZjZg0KDQotcnctcnctci0tIDEgYjBkMjY0NyBiMGQyNjQ3ICAgICAgMTE0MTczIEFwciAyOCAwMjozNSBFUlIyNTA0MDkxMC5jYWxtZC5tZHVwLnZjZi5pZHgNCg0KLXJ3LXJ3LXItLSAxIGIwZDI2NDcgYjBkMjY0NyAgICAgICAgICAgMCBBcHIgMjggMDI6MzAgc3VtbWFyeV9FUlIyNTA0MDkxMC5jYWxtZC5tZHVwDQo=