[med-svn] [rna-star] 01/06: Imported Upstream version 2.5.0a+dfsg

Andreas Tille tille at debian.org
Thu Dec 31 11:54:07 UTC 2015


This is an automated email from the git hooks/post-receive script.

tille pushed a commit to branch master
in repository rna-star.

commit 86f7372dc19bc64fbe39fde6c0d906e262e14236
Author: Andreas Tille <tille at debian.org>
Date:   Thu Dec 31 12:26:46 2015 +0100

    Imported Upstream version 2.5.0a+dfsg
---
 .travis.yml                                        |    7 +
 CHANGES                                            |  259 ---
 CHANGES.md                                         |  330 +++
 LICENSE                                            |    2 +-
 Makefile                                           |   24 +
 README                                             |   41 -
 README.md                                          |  128 ++
 RELEASEnotes => RELEASEnotes.md                    |   24 +-
 STAR-Fusion-0.1.1/LICENSE                          |   28 -
 STAR-Fusion-0.1.1/README.md                        |  103 -
 STAR-Fusion-0.1.1/STAR-Fusion                      |  755 -------
 STAR-Fusion-0.1.1/lib/SAM_entry.pm                 |  544 -----
 STAR-Fusion-0.1.1/lib/SAM_reader.pm                |  109 -
 STAR-Fusion-0.1.1/notes                            |    1 -
 STAR-Fusion-0.1.1/test/Chimeric.out.junction.gz    |  Bin 237561 -> 0 bytes
 STAR-Fusion-0.1.1/test/Chimeric.out.sam.gz         |  Bin 507939 -> 0 bytes
 STAR-Fusion-0.1.1/test/cleanMe.sh                  |    4 -
 STAR-Fusion-0.1.1/test/runMe.sh                    |    4 -
 doc/STARmanual.pdf                                 |  Bin 242969 -> 249630 bytes
 extras/doc-latex/STARmanual.tex                    |   32 +-
 extras/doc-latex/parametersDefault.tex             |   56 +-
 extras/doc-latex/texlive.profile                   |   33 +
 extras/doc-latex/texlive_install.sh                |   49 +
 .../sjFromSAMcollapseUandM_inclOverlaps.awk        |   55 +
 source/Genome.cpp                                  |   37 +-
 source/Genome.h                                    |    4 +
 source/Genome_insertSequences.cpp                  |   33 +
 source/GlobalVariables.cpp                         |    5 +-
 source/IncludeDefine.h                             |    9 +-
 source/Makefile                                    |  126 +-
 source/Parameters.cpp                              |  159 +-
 source/Parameters.h                                |   44 +-
 source/ReadAlign.cpp                               |    6 +-
 source/ReadAlign.h                                 |   10 +-
 source/ReadAlignChunk.cpp                          |    2 +-
 source/ReadAlignChunk_processChunks.cpp            |    4 +-
 source/ReadAlign_alignBAM.cpp                      |    2 +-
 source/ReadAlign_chimericDetection.cpp             |    7 +-
 source/ReadAlign_multMapSelect.cpp                 |   72 +-
 source/ReadAlign_outputAlignments.cpp              |   32 +-
 source/ReadAlign_outputTranscriptSAM.cpp           |    2 +-
 source/ReadAlign_stitchWindowSeeds.cpp             |   12 +-
 source/STAR.cpp                                    |   47 +-
 {extras/doc-latex => source}/STARmanual.tex        |    2 +-
 source/SuffixArrayFuns.cpp                         |  200 ++
 source/SuffixArrayFuns.h                           |    4 +-
 source/Transcriptome.cpp                           |   14 +-
 source/VERSION                                     |    2 +-
 source/bam_cat.c                                   |    3 +
 source/bam_cat.h                                   |    8 +
 source/extendAlign.cpp                             |   20 +-
 source/extendAlign.h                               |    3 +-
 source/funCompareUintAndSuffixes.cpp               |   40 +
 source/funCompareUintAndSuffixes.h                 |    7 +
 source/genomeGenerate.cpp                          |  344 +--
 source/genomeParametersWrite.cpp                   |    3 +-
 source/genomeSAindex.cpp                           |  265 +++
 source/genomeSAindex.h                             |   10 +
 source/genomeScanFastaFiles.cpp                    |  100 +
 source/genomeScanFastaFiles.h                      |    9 +
 source/insertSeqSA.cpp                             |  280 +++
 source/insertSeqSA.h                               |   10 +
 source/loadGTF.cpp                                 |   22 +-
 source/parametersDefault                           |   44 +-
 source/parametersDefault.xxd                       | 2305 ++++++++++++++++++++
 source/readLoad.cpp                                |   10 +-
 source/serviceFuns.cpp                             |    2 +
 source/sjSplitAlign.cpp                            |    3 +
 source/sjdbBuildIndex.cpp                          |  157 +-
 source/sjdbInsertJunctions.cpp                     |   26 +-
 source/stitchAlignToTranscript.cpp                 |   11 +-
 source/stitchGapIndel.cpp                          |    3 +
 source/stitchWindowAligns.cpp                      |   37 +-
 source/streamFuns.cpp                              |   14 +-
 source/streamFuns.h                                |    6 +-
 75 files changed, 4751 insertions(+), 2414 deletions(-)

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..01a8422
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,7 @@
+git:
+  submodules: false
+before_script:
+  - cd source
+before_script
+script:
+  - make STAR
diff --git a/CHANGES b/CHANGES
deleted file mode 100644
index d98990c..0000000
--- a/CHANGES
+++ /dev/null
@@ -1,259 +0,0 @@
-STAR 2.4.2a 2015/06/19
-Implemented --quantMode GeneCounts option for counting number of reads per gene, similar to htseq-count.
-STARlong: fixed --outFilterIntronMotifs and --outSAMstrandField options.
-Yet another fix for --sjdbOverhang logic.
-Error message when shared memory and on the fly junction insertion are used together.
-Fixed a bug causing unnecessary 1 base soft-clipping in rare cases with sparse suffix array.
-Fixed a bug that caused problems with junction motifs in rare cases. Very few alignments affected, <1 per million.
-
-STAR 2.4.1d 2015/05/19
-Fixed problems with --sjdbOverhang default and user-defined values.
-Fixed problems with occasional non-adjacent output of multiple alignments into the unsorted BAM file and transcriptome BAM file.
-Fixed a bug causing seg-faults when shared memory options in --genomeLoad are used with --outStd SAM.
-Fixed a bug causing seg-faults for small values of --limitIObufferSize.
-Added STAR long pre-compiled executables.
-Fixed very minor issues with filtering into SJ.out.tab .
-Fixed some bugs in STARlong mapping algorithm.
-Fixed --outFilter BySJout filtering for STARlong.
-Fixed XS attrbutes in STARlong.
-Added --runDirPerm option for permissions of run-time directories.
-
-
-STAR 2.4.1c 2015/04/24
-Added latest version of STAR-Fusion as a separate directory.
-Fixed some compilation problems introduced in 2.4.1b.
-Added Mac executable.
-
-
-STAR 2.4.1b 2015/04/23
-Fixed a bug introduced in 2.4.1a causing serious problems for genomes generated without annotations.
-      If you generated a genome without annotations with 2.4.1a please re-generate it.
-Fixed a bug causing seg-faults when generating genomes with a large (>500k) number of junctions.
-Fixed a bug causing seg-faults with --chimOutType WithinBAM for single-end reads.
-Fixed a bug with required --sjdbOverhang at the mapping step.
-
-STAR 2.4.1a 2015/04/17
-The annotations can now be included on the fly at the mapping step, without including them at the genome generation step.
-New option to activate on the fly "per sample" 2-pass method: "--twopassMode Basic".
-2-pass mode can now be used with annotations, which can be included either at the run-time, or at the genome generation step.
-Included link (submodule) to Brian Haas' STAR-Fusion code for detecting fusion transcript from STAR chimeric output:  https://github.com/STAR-Fusion/STAR-Fusion
-Included Gery Vessere's shared memory implementation for POSIX and SysV. To compile STAR with POSIX shared memory, use `make POSIXSHARED`
-New option "--chimOutType WithinBAM" to include chimeric alignments together with normal alignments in the main (sorted or unsorted) BAM file(s).
-New option "--quantTranscriptomeBan Singleend" allows insertions, deletions ans soft-clips in the transcriptomic alignments, which are allowed by some expression quantification software (e.g. eXpress). 
-New option "--alignEndsTypeExtension Extend5pOfRead1" to enforce full extension of the 5p of the read1, while all other ends undergo local alignment and may be soft-clipped.
-
-2.4.0k 03/30/2015
-Implemented new BAM sorting algorithm that reduces significantly the required RAM.
-
-2.4.0j 02/04/2015
-Fixed a problem with scoring alignments for STARlong. STARlong alignments are slightly modified.
-Fixed a bug introduced in 2.4.0i that dropped a large number of aligmnents for --quantMode TranscriptomeSAM.
-	Transcriptome alignments are now the same as in version 2.4.0h.
-Fixed a problem with lower case read sequences for --outSAMtype BAM options.
-Fixed a bug preventing parameter value to be "-".
-Fixed --genomeLoad LoadAndRemove option.
-
-2.4.0i 01/14/2015
-Fixed a bug with the _STARtmp temporary directory name for the 2-pass runs.
-Fixed a bug causing seg-faults for genome generation.
-Fixed a bug causing seg-faults for --quantMode TranscriptomeSAM
-
-2.4.0h 12/09/2014
-Fixed the problem causing Ubuntu error: "sh: 1: Syntax error: Bad fd number".
-Added --quantTranscriptomeBAMcompression option.
-Add newline at the end of STAR_VERSION string (contributed by Daniel Nicorici).
-Fixed a bug with parsing the last line of paired FASTA files (contributed by Alex Rolfe).
-
-2.4.0g 11/26/2014
-Fixed a bug with output score (AS attribute) of some chimeric alignments.
-Added --alignSoftClipAtReferenceEnds No option which prevents soft clipping of alignments at the reference (chromosome) ends, for compatibility with Cufflinks/Cuffmerge.
-Fixed wrong output of chimeric junctions boundaries in the Chimeric.out.junction file.
-Added --outSAMflagOR, --outSAMflagAND options to set specific bits of the SAM FLAG.
---sjdbFileChrStartEnd can now accept multiple files which will be concatenated.
-Fixed the header of the Log.progress.out .
-Fixed a bug that prevented output of transcriptomic alignments (--quantMode TranscriptomeSAM)  with 1 base junction overhangs.
-Added --sysShell option to specify path to bash, in cases where bash is not the default shell.
---outBAMcompression default changed to 1, which apparently does not change deflation ratio, but is much faster.
-Added --outBAMsortingThreadN option to specify number of threads for BAM sorting. By default (0) it's equal to min(6,runThreadN).
-
-2.4.0f1 10/30/2014
-Added read group (RG) BAM attributes to transcriptome BAM (contributed by https://github.com/godotgildor).
-Fixed a bug with double ID field in the RG header line (contributed by https://github.com/godotgildor).
-Fixed a bug in the 2-pass method (--twopass1readsN).
-Fixed a problem with RAM allocation for BAM sorting.
-
-2.4.0e 10/24/2014
-Added manual in PDF.
-New sub-directories: source, bin, doc.
-Output more information about read files into Log.out.
-Fixed some issues that may have caused dropping of multiple reads files.
-Added more thorough error checking for genome generation.
-Fixed a bug causing seg-faults with single-mate alignments for BAM sorting.
-Fixed some compilation issues on Mac OS X. Note that the default Clang lacks openMP support which is required for STAR compilation.
-Added Mac OS X executable.
-
-2.4.0d 09/25/2014
-Added .gitignore.
-Fixed the problem with 2nd field in the read name shorter than 3 bases (non-Illumina fastq).
-Added --outBAMcompression option.
-Added --bamRemoveDuplicatesType and --bamRemoveDuplicatesMate2basesN options.
-Added --outWigType wiggle read1_5p read2 options.
-Added --outWigNorm option.
-
-2.4.0c 09/07/2014
-Automated git version.
-Fixed a problem with overflowing SJ buffer.
-Implemented options --twopass1readsN, --twopassSJlimit, --readMapNumber.
-
-2.4.0b 08/29/2014
-Fixed problems with spaces in --outFilePrefixName.
-Fixed version information.
-
-2.4.0a 08/11/2014
-Implemented --outFilterMismatchNoverReadLmax option for a more consistent control of mismatches.
-
-2.3.1z16 08/05/2014
-Implemented --outWigReferencesPrefix option to filter references in the signal output.
-Implemented --runMode inputAlignmentsFromBAM --inputBAMfile
-
-2.3.1z15  
-Implemented --outWigType bedGraph read1_5p option.
-Fixed a problem with chimeric alignments with overlapping segments.
-Fixed a problem with processing of fasta read input.
-
-2.3.1z14 07/24/2014
-Implemented 0x200 SAM flag for reads that did not pass Illumina filtering (i.e. contain “Y” as the 3rd character in the second field of the read name)
-Implemented comma-separated lists in the --outSAMattrRGline read groups that will assign different read groups to multiple comma-separated read files in --readFilesIn
-
-2.3.1z13 07/04/2014
-Fixed problems with STARlong.
-
-2.3.1z12 06/30/2014
-Fixed problems with SAM/BAM output to stdout.
-
-2.3.1z11 06/27/2014
-Switched to htslib samtools library.
-Fixed problem with indel near known splice junctions.
-Fixed problem with FASTA reads input.
-
-2.3.1z10 06/20/2014
-Fixed problem with compilation, samtools/ZLIB related.
-
-2.3.1z9 06/19/2014
-2.3.1z8 
-2.3.1z7 
-Fixed problems with transcriptomic output.
-Changed --sjdbFileChrStartEnd importing to allow direct import from SJ.out.tab
-
-2.3.1z6 05/30/2014
-2.3.1z5 05/30/2014
-Fixed a bug causing problems with multiple zipped input files.
-Preliminary release of BAM sorting and wiggle output
-
-2.3.1z4 05/06/2014
-Preliminary release with transcriptome output.
-
-2.3.1z2 04/29/2014
-Fixed a bug causing problems in some chimeric alignments.
-Fixed a bug causing overflowing of SAM ISIZE.
-Fixed chimeric output problems with --outFilterType BySJout option
-Added extra Log.out messages for multi-threaded jobs.
-
-2.3.1z1 03/13/2014
-SAM header changes: 
-    removed "cl:" attribute from the @PG line, output it as a separate comment line
-    added --outSAMheaderHD, --outSAMheaderPG, --outSAMheaderCommentFile options
-Added --outTmpDir, which set the path forSTAr temporary directory independent of --outFileNamePrefix
-
-2.3.1z 02/05/2014
-Fixed the incorrect behavior of --genomeLoad LoadAndRemove option.
-
-2.3.1y 01/24/2014
-Added read group sam attribute via --outSAMattrRGline parameter.
-Fixed gcc 4.7.0. compilation problem.
-Correct reverse complementarity of all IUPAC nucleotide codes in the SAM output.
-
-2.3.1x 01/08/2014
-Fixed a bug with --alignEndsType EndToEnd.
-
-2.3.1v 12/21/2013
-Added --alignEndsType EndToEnd option to align reads end-to-end, i.e. prohibit soft-clipping.
---outSAMattributes now allows to specify the SAM attributes in the desired combination and order.
-Implemented standard (samtools-like) NM and MD tags.
-Added --outSAMmapqUnique parameter (=255 by default), MAPQ value for unique mappers.
-
-2.3.1u 11/23/2013
-Added --outSAMreadID={Standard,Number} parameter to output read numbered read IDs.
-Aded --outSAMmode NoQS option to suppress output of quality scores.
-
-2.3.1t 11/20/2013
-Fixed a bug that prevented alignment to the very beginning of the first reference.
-
-2.3.1s 11/06/2013
-Fixed a bug that produced incorrect placement of short deletions.
-
-2.3.1r 10/01/2013
-Compilation option to output "local alignment chanins".
-Compilation option to output suffix array as a text file.
-
-2.3.1q 08/15/2013
-Fixed a problem with junction overhang in SJ.out.tab file for overlapping mates.
-
-2.3.1p 04/13/2013
-Fixed GCC 4.7 compatibility problems.
-Changed min memory requirement for genome generation.
-
-2.3.1o 04/13/2013
-Fixed a bug with comma separated lists of input files.
-
-2.3.1n 04/30/2013
-Replaced incorretly released 2.3.1m.
-
-2.3.1m 04/24/2013
-Fixed a bug which in some cases caused problems with long reads.
-
-2.3.1l 04/15/2013
-Fixed a problem with --readFilesCommand.
-
-2.3.1k 04/15/2013
-Fixed chimeric output for single-end reads.
-Fixed a problem with --outFilterScoreMinOverLread 0 --outFilterMatchNminOverLread 0 settings.
-
-2.3.1j 04/11/2013
-Allowed spaces in paths: paths that contain spaces should be quoted with " ". Thanks for Tyler Hyndman for suggesting this patch.
-
-2.3.1i 04/10/2013
-Fixed problems with overflowing SJ buffer, new input parameters: --limitOutSJcollapsed, --limitOutSJoneRead.
-
-2.3.1h 04/02/2013
-Prevent output of strangely overlapping mates as chimeras.
-Report error if --sjdbOverhang=0 with set --sjdbFileChrStartEnd or --sjdbGTFfile.
-
-2.3.1g 03/29/2013
-Implemented detection of proximal same-strand chimeras. Now it is possible to detect circular RNA (conisdered "chimeric").
-More accurate treatment of overlapping mates.
-
-2.3.1f 03/21/2013
-New option --outSAMorder PairedKeepInputOrder to output alignments in the same order as they appear in the input FASTQ/A files.
-
-2.3.1e 03/18/2013
-Fixed possible problems with multi-threaded runs for small files which could have caused empty Chimeric.* and Unmapped.* output on some systems.
-
-2.3.1d 03/17/2013
-New option --outSAMprimaryFlag AllBestScore for marking all alignments with the best score as primary.
-New parameter --limitOutSAMoneReadBytes 100000, limits the size of one SAM entry - important when a large number of multimappers is recorded.
-Fixed a possible problem with Unmapped.* and Chimeric.* output which could generate empty or truncated output on some systems.
-Coded a safer removal of the temporary directory _tmp which could have failed on some systems.
-Fixed a bug which resulted in unexpected behavior for alignIntronMax < 7.
-
-2.3.1c 03/01/2013
-Fixed a bug which duplicated output in Chimeric.* and Unmapped.* when --outFilterType BySJout option is used.
-
-2.3.1b 02/28/2013
-Fixed possible issue which in some cases could have resulted in empty Chimeric.out.*
-
-2.3.1a 02/25/2013
-Fixed incorrect processing of --sjdbGTFchrPrefix.
-
-2.3.0e
-
diff --git a/CHANGES.md b/CHANGES.md
new file mode 100644
index 0000000..3b165d1
--- /dev/null
+++ b/CHANGES.md
@@ -0,0 +1,330 @@
+STAR 2.4.5a 2015/11/06
+======================
+
+**STAR now uses essential c++11 features and requires gcc 4.7.0 or later.**
+
+Major new features:
+-------------------
+* Implemented on the fly insertion of the extra sequences into the genome indexes.
+* Implemented --outSAMmultNmax parameter to limit the number of output alignments for multimappers.
+* Implemented --outMultimapperOrder Random option to output multiple alignments in random order. 
+    This also randomizes the choice of the primary alignment. Parameter --runRNGseed can be used to set the random generator seed.
+    With this option, the ordering of multi-mapping alignments of each read, and the choice of the primary alignment will vary from run to run, unless only one thread is used and the seed is kept constant.
+
+Minor new features:
+-------------------
+* Implemented --outSAMattrIHstart parameter. Setting it to 0 may be required for compatibility with downstream software such as Cufflinks or StringTie.
+* Implemented --outSAMfilter KeepOnlyAddedReferences option.
+* Implemented --help option - thanks to @yhoogstrate for the code.
+* Implemented --alignEndsType Extend3pOfRead1 option for full extension of the 3' end of read 1.
+* Implemented --alignSJstitchMismatchNmax option to allow for mismatches around non-canonical junctions.
+* Implemented --chimSegmentReadGapMax parameter which defines the maximum gap in the read sequence between chimeric segments. By default it is set to 0 to replicate the behavior of the previous STAR versions.
+* Implemented --chimFilter banGenomicN | None options to prohibit or allow the N characters in the vicinity of the chimeric junctions. By default, they are prohibited - the same behavior as in the previous versions.
+
+Bug fixes:
+----------
+* For STARlong, increased compilation-time max read length to 500000 and max number of exons to 1000
+* Fixed a bug which caused problems in some cases of genome generation without annotations.
+* Fixed a bug in the --alignEndsType Extend5pOfRead1 option.
+
+Code improvements:
+------------------
+* Improved compilation flags handling in Makefile - thanks to Christian Krause for the code.
+* Improved treatment of the streams and files - thanks to Alex Finkel for the code.
+* Merged pull request from Nathan S. Watson-Haigh: Makefile for manual;Travis-CI automated build; Update STAR-Fusion submodule to v0.3.1
+* Merged pull request from Alex Finkel to allow 'parameter=value' option formatting, e.g. --runThreadN=8.
+
+
+
+STAR 2.4.2a 2015/06/19
+======================
+
+* Implemented --quantMode GeneCounts option for counting number of reads per gene, similar to htseq-count.
+* STARlong: fixed --outFilterIntronMotifs and --outSAMstrandField options.
+* Yet another fix for --sjdbOverhang logic.
+* Error message when shared memory and on the fly junction insertion are used together.
+* Fixed a bug causing unnecessary 1 base soft-clipping in rare cases with sparse suffix array.
+* Fixed a bug that caused problems with junction motifs in rare cases. Very few alignments affected, <1 per million.
+
+STAR 2.4.1d 2015/05/19
+======================
+
+* Fixed problems with --sjdbOverhang default and user-defined values.
+* Fixed problems with occasional non-adjacent output of multiple alignments into the unsorted BAM file and transcriptome BAM file.
+* Fixed a bug causing seg-faults when shared memory options in --genomeLoad are used with --outStd SAM.
+* Fixed a bug causing seg-faults for small values of --limitIObufferSize.
+* Added STAR long pre-compiled executables.
+* Fixed very minor issues with filtering into SJ.out.tab .
+* Fixed some bugs in STARlong mapping algorithm.
+* Fixed --outFilter BySJout filtering for STARlong.
+* Fixed XS attrbutes in STARlong.
+* Added --runDirPerm option for permissions of run-time directories.
+
+
+STAR 2.4.1c 2015/04/24
+======================
+
+* Added latest version of STAR-Fusion as a separate directory.
+* Fixed some compilation problems introduced in 2.4.1b.
+* Added Mac executable.
+
+
+STAR 2.4.1b 2015/04/23
+======================
+
+* Fixed a bug introduced in 2.4.1a causing serious problems for genomes generated without annotations.
+      If you generated a genome without annotations with 2.4.1a please re-generate it.
+* Fixed a bug causing seg-faults when generating genomes with a large (>500k) number of junctions.
+* Fixed a bug causing seg-faults with --chimOutType WithinBAM for single-end reads.
+* Fixed a bug with required --sjdbOverhang at the mapping step.
+
+STAR 2.4.1a 2015/04/17
+======================
+
+* The annotations can now be included on the fly at the mapping step, without including them at the genome generation step.
+* New option to activate on the fly "per sample" 2-pass method: "--twopassMode Basic".
+* 2-pass mode can now be used with annotations, which can be included either at the run-time, or at the genome generation step.
+* Included link (submodule) to Brian Haas' STAR-Fusion code for detecting fusion transcript from STAR chimeric output:  https://github.com/STAR-Fusion/STAR-Fusion
+* Included Gery Vessere's shared memory implementation for POSIX and SysV. To compile STAR with POSIX shared memory, use `make POSIXSHARED`
+* New option "--chimOutType WithinBAM" to include chimeric alignments together with normal alignments in the main (sorted or unsorted) BAM file(s).
+* New option "--quantTranscriptomeBan Singleend" allows insertions, deletions ans soft-clips in the transcriptomic alignments, which are allowed by some expression quantification software (e.g. eXpress). 
+* New option "--alignEndsTypeExtension Extend5pOfRead1" to enforce full extension of the 5p of the read1, while all other ends undergo local alignment and may be soft-clipped.
+
+2.4.0k 03/30/2015
+=================
+
+* Implemented new BAM sorting algorithm that reduces significantly the required RAM.
+
+2.4.0j 02/04/2015
+=================
+
+* Fixed a problem with scoring alignments for STARlong. STARlong alignments are slightly modified.
+* Fixed a bug introduced in 2.4.0i that dropped a large number of aligmnents for --quantMode TranscriptomeSAM.
+	Transcriptome alignments are now the same as in version 2.4.0h.
+* Fixed a problem with lower case read sequences for --outSAMtype BAM options.
+* Fixed a bug preventing parameter value to be "-".
+* Fixed --genomeLoad LoadAndRemove option.
+
+2.4.0i 01/14/2015
+=================
+
+* Fixed a bug with the _STARtmp temporary directory name for the 2-pass runs.
+* Fixed a bug causing seg-faults for genome generation.
+* Fixed a bug causing seg-faults for --quantMode TranscriptomeSAM
+
+2.4.0h 12/09/2014
+=================
+
+* Fixed the problem causing Ubuntu error: "sh: 1: Syntax error: Bad fd number".
+* Added --quantTranscriptomeBAMcompression option.
+* Add newline at the end of STAR_VERSION string (contributed by Daniel Nicorici).
+* Fixed a bug with parsing the last line of paired FASTA files (contributed by Alex Rolfe).
+
+2.4.0g 11/26/2014
+=================
+
+* Fixed a bug with output score (AS attribute) of some chimeric alignments.
+* Added --alignSoftClipAtReferenceEnds No option which prevents soft clipping of alignments at the reference (chromosome) ends, for compatibility with Cufflinks/Cuffmerge.
+* Fixed wrong output of chimeric junctions boundaries in the Chimeric.out.junction file.
+* Added --outSAMflagOR, --outSAMflagAND options to set specific bits of the SAM FLAG.
+* --sjdbFileChrStartEnd can now accept multiple files which will be concatenated.
+* Fixed the header of the Log.progress.out .
+* Fixed a bug that prevented output of transcriptomic alignments (--quantMode TranscriptomeSAM)  with 1 base junction overhangs.
+* Added --sysShell option to specify path to bash, in cases where bash is not the default shell.
+* --outBAMcompression default changed to 1, which apparently does not change deflation ratio, but is much faster.
+* Added --outBAMsortingThreadN option to specify number of threads for BAM sorting. By default (0) it's equal to min(6,runThreadN).
+
+2.4.0f1 10/30/2014
+==================
+
+* Added read group (RG) BAM attributes to transcriptome BAM (contributed by https://github.com/godotgildor).
+* Fixed a bug with double ID field in the RG header line (contributed by https://github.com/godotgildor).
+* Fixed a bug in the 2-pass method (--twopass1readsN).
+* Fixed a problem with RAM allocation for BAM sorting.
+
+2.4.0e 10/24/2014
+=================
+
+* Added manual in PDF.
+* New sub-directories: source, bin, doc.
+* Output more information about read files into Log.out.
+* Fixed some issues that may have caused dropping of multiple reads files.
+* Added more thorough error checking for genome generation.
+* Fixed a bug causing seg-faults with single-mate alignments for BAM sorting.
+* Fixed some compilation issues on Mac OS X. Note that the default Clang lacks openMP support which is required for STAR compilation.
+* Added Mac OS X executable.
+
+2.4.0d 09/25/2014
+=================
+
+* Added .gitignore.
+* Fixed the problem with 2nd field in the read name shorter than 3 bases (non-Illumina fastq).
+* Added --outBAMcompression option.
+* Added --bamRemoveDuplicatesType and --bamRemoveDuplicatesMate2basesN options.
+* Added --outWigType wiggle read1_5p read2 options.
+* Added --outWigNorm option.
+
+2.4.0c 09/07/2014
+=================
+
+* Automated git version.
+* Fixed a problem with overflowing SJ buffer.
+* Implemented options --twopass1readsN, --twopassSJlimit, --readMapNumber.
+
+2.4.0b 08/29/2014
+=================
+
+* Fixed problems with spaces in --outFilePrefixName.
+* Fixed version information.
+
+2.4.0a 08/11/2014
+=================
+
+* Implemented --outFilterMismatchNoverReadLmax option for a more consistent control of mismatches.
+
+2.3.1z16 08/05/2014
+
+Implemented --outWigReferencesPrefix option to filter references in the signal output.
+Implemented --runMode inputAlignmentsFromBAM --inputBAMfile
+
+2.3.1z15  
+Implemented --outWigType bedGraph read1_5p option.
+Fixed a problem with chimeric alignments with overlapping segments.
+Fixed a problem with processing of fasta read input.
+
+2.3.1z14 07/24/2014
+Implemented 0x200 SAM flag for reads that did not pass Illumina filtering (i.e. contain “Y” as the 3rd character in the second field of the read name)
+Implemented comma-separated lists in the --outSAMattrRGline read groups that will assign different read groups to multiple comma-separated read files in --readFilesIn
+
+2.3.1z13 07/04/2014
+Fixed problems with STARlong.
+
+2.3.1z12 06/30/2014
+Fixed problems with SAM/BAM output to stdout.
+
+2.3.1z11 06/27/2014
+Switched to htslib samtools library.
+Fixed problem with indel near known splice junctions.
+Fixed problem with FASTA reads input.
+
+2.3.1z10 06/20/2014
+Fixed problem with compilation, samtools/ZLIB related.
+
+2.3.1z9 06/19/2014
+2.3.1z8 
+2.3.1z7 
+Fixed problems with transcriptomic output.
+Changed --sjdbFileChrStartEnd importing to allow direct import from SJ.out.tab
+
+2.3.1z6 05/30/2014
+2.3.1z5 05/30/2014
+Fixed a bug causing problems with multiple zipped input files.
+Preliminary release of BAM sorting and wiggle output
+
+2.3.1z4 05/06/2014
+Preliminary release with transcriptome output.
+
+2.3.1z2 04/29/2014
+Fixed a bug causing problems in some chimeric alignments.
+Fixed a bug causing overflowing of SAM ISIZE.
+Fixed chimeric output problems with --outFilterType BySJout option
+Added extra Log.out messages for multi-threaded jobs.
+
+2.3.1z1 03/13/2014
+SAM header changes: 
+    removed "cl:" attribute from the @PG line, output it as a separate comment line
+    added --outSAMheaderHD, --outSAMheaderPG, --outSAMheaderCommentFile options
+Added --outTmpDir, which set the path forSTAr temporary directory independent of --outFileNamePrefix
+
+2.3.1z 02/05/2014
+Fixed the incorrect behavior of --genomeLoad LoadAndRemove option.
+
+2.3.1y 01/24/2014
+Added read group sam attribute via --outSAMattrRGline parameter.
+Fixed gcc 4.7.0. compilation problem.
+Correct reverse complementarity of all IUPAC nucleotide codes in the SAM output.
+
+2.3.1x 01/08/2014
+Fixed a bug with --alignEndsType EndToEnd.
+
+2.3.1v 12/21/2013
+Added --alignEndsType EndToEnd option to align reads end-to-end, i.e. prohibit soft-clipping.
+--outSAMattributes now allows to specify the SAM attributes in the desired combination and order.
+Implemented standard (samtools-like) NM and MD tags.
+Added --outSAMmapqUnique parameter (=255 by default), MAPQ value for unique mappers.
+
+2.3.1u 11/23/2013
+Added --outSAMreadID={Standard,Number} parameter to output read numbered read IDs.
+Aded --outSAMmode NoQS option to suppress output of quality scores.
+
+2.3.1t 11/20/2013
+Fixed a bug that prevented alignment to the very beginning of the first reference.
+
+2.3.1s 11/06/2013
+Fixed a bug that produced incorrect placement of short deletions.
+
+2.3.1r 10/01/2013
+Compilation option to output "local alignment chanins".
+Compilation option to output suffix array as a text file.
+
+2.3.1q 08/15/2013
+Fixed a problem with junction overhang in SJ.out.tab file for overlapping mates.
+
+2.3.1p 04/13/2013
+Fixed GCC 4.7 compatibility problems.
+Changed min memory requirement for genome generation.
+
+2.3.1o 04/13/2013
+Fixed a bug with comma separated lists of input files.
+
+2.3.1n 04/30/2013
+Replaced incorretly released 2.3.1m.
+
+2.3.1m 04/24/2013
+Fixed a bug which in some cases caused problems with long reads.
+
+2.3.1l 04/15/2013
+Fixed a problem with --readFilesCommand.
+
+2.3.1k 04/15/2013
+Fixed chimeric output for single-end reads.
+Fixed a problem with --outFilterScoreMinOverLread 0 --outFilterMatchNminOverLread 0 settings.
+
+2.3.1j 04/11/2013
+Allowed spaces in paths: paths that contain spaces should be quoted with " ". Thanks for Tyler Hyndman for suggesting this patch.
+
+2.3.1i 04/10/2013
+Fixed problems with overflowing SJ buffer, new input parameters: --limitOutSJcollapsed, --limitOutSJoneRead.
+
+2.3.1h 04/02/2013
+Prevent output of strangely overlapping mates as chimeras.
+Report error if --sjdbOverhang=0 with set --sjdbFileChrStartEnd or --sjdbGTFfile.
+
+2.3.1g 03/29/2013
+Implemented detection of proximal same-strand chimeras. Now it is possible to detect circular RNA (conisdered "chimeric").
+More accurate treatment of overlapping mates.
+
+2.3.1f 03/21/2013
+New option --outSAMorder PairedKeepInputOrder to output alignments in the same order as they appear in the input FASTQ/A files.
+
+2.3.1e 03/18/2013
+Fixed possible problems with multi-threaded runs for small files which could have caused empty Chimeric.* and Unmapped.* output on some systems.
+
+2.3.1d 03/17/2013
+New option --outSAMprimaryFlag AllBestScore for marking all alignments with the best score as primary.
+New parameter --limitOutSAMoneReadBytes 100000, limits the size of one SAM entry - important when a large number of multimappers is recorded.
+Fixed a possible problem with Unmapped.* and Chimeric.* output which could generate empty or truncated output on some systems.
+Coded a safer removal of the temporary directory _tmp which could have failed on some systems.
+Fixed a bug which resulted in unexpected behavior for alignIntronMax < 7.
+
+2.3.1c 03/01/2013
+Fixed a bug which duplicated output in Chimeric.* and Unmapped.* when --outFilterType BySJout option is used.
+
+2.3.1b 02/28/2013
+Fixed possible issue which in some cases could have resulted in empty Chimeric.out.*
+
+2.3.1a 02/25/2013
+Fixed incorrect processing of --sjdbGTFchrPrefix.
+
+2.3.0e
+
diff --git a/LICENSE b/LICENSE
index 006d51c..3d31d90 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
 STAR
 Spliced Transcripts Alignment to a Reference
-© Alexander Dobin, 2009-20134
+© Alexander Dobin, 2009-2015
 
 STAR is a free open source software distributed under GPLv3
 
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..97aca2d
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,24 @@
+# You want latexmk to *always* run, because make does not have all the info.
+.PHONY: 
+
+INPUT_DIR = ./extras/doc-latex
+OUTPUT_DIR = ./doc
+
+all : STAR manual
+
+STAR :
+	cd source && $(MAKE) $@
+manual : $(OUTPUT_DIR)/STARmanual.pdf
+
+
+%.tex : %.raw
+	./raw2tex $< > $@
+%.tex : %.dat
+	./dat2tex $< > $@
+
+$(OUTPUT_DIR)/STARmanual.pdf : $(INPUT_DIR)/STARmanual.tex $(INPUT_DIR)/parametersDefault.tex
+	cd $(INPUT_DIR) && latexmk -pdf -output-directory=../../$(OUTPUT_DIR) -jobname=STARmanual -pdflatex='pdflatex -halt-on-error %O %S -synctex=1 -interaction=nonstopmode --src-specials' -quiet -f -use-make $(basename $(notdir $<))
+
+clean : $(INPUT_DIR)/STARmanual.tex
+	cd $(INPUT_DIR) && latexmk -C -output-directory=../../$(OUTPUT_DIR) -jobname=STARmanual $(basename $(notdir $<))
+	cd source && $(MAKE) $@
diff --git a/README b/README
deleted file mode 100644
index 78ab585..0000000
--- a/README
+++ /dev/null
@@ -1,41 +0,0 @@
-STAR 2.4
-Spliced Transcripts Alignment to a Reference
-© Alexander Dobin, 2009-2015
-
-AUTHOR/SUPPORT:
-Alex Dobin, dobin at cshl.edu
-https://groups.google.com/d/forum/rna-star
-
-MANUAL:
-https://github.com/alexdobin/STAR/blob/master/doc/STARmanual.pdf
-
-RELEASEnotes contains detailed information about the latest major release
-
-DIRECTORIES CONTENTS:
-source: all source files required for compilation
-bin: pre-compiled executables for Linux and Mac OS X
-doc: documentation
-extras: miscellaneous files and scripts
-
-STAR-Fusion: fusion detection developed by Brian Haas, see https://github.com/STAR-Fusion/STAR-Fusion for details.
-             To populate this submodule, clone STAR with `git clone --recursive https://github.com/alexdobin/STAR`
-STAR-Fusion-x.x.x: latest release of the STAR-Fusion
-
-
-COMPILING FROM SOURCE:
-Unzip and "cd" into source/ subdirectory.
-Linux:    run "make STAR" .
-Mac OS X: run "make STARforMacStatic" . 
-          If g++ compiler (true g++, not Clang sym-link) is not on the path, run "make STARforMacStatic CXX=/path/to/gcc" .
-
-
-HARDWARE/SOFTWARE REQUIREMENTS:
-x86-64 compatible processors
-64 bit Linux or Mac OS X 
-30GB of RAM for human genome 
-
-
-LIMITATIONS:
-This release was tested with the default parameters for human and mouse genomes.
-Please contact the author for a list of recommended parameters for much larger or much smaller genomes.
-
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..295c254
--- /dev/null
+++ b/README.md
@@ -0,0 +1,128 @@
+STAR 2.5
+========
+Spliced Transcripts Alignment to a Reference
+© Alexander Dobin, 2009-2015
+
+AUTHOR/SUPPORT
+==============
+Alex Dobin, dobin at cshl.edu
+https://groups.google.com/d/forum/rna-star
+
+MANUAL
+======
+https://github.com/alexdobin/STAR/blob/master/doc/STARmanual.pdf
+
+[RELEASEnotes](RELEASEnotes) contains detailed information about the latest major release
+
+DIRECTORY CONTENTS
+==================
+  * source: all source files required for compilation
+  * bin: pre-compiled executables for Linux and Mac OS X
+  * doc: documentation
+  * extras: miscellaneous files and scripts
+  * STAR-Fusion: fusion detection developed by Brian Haas, see https://github.com/STAR-Fusion/STAR-Fusion for details.
+             To populate this submodule, clone STAR with `git clone --recursive https://github.com/alexdobin/STAR`
+  * STAR-Fusion-x.x.x: latest release of the STAR-Fusion
+
+
+COMPILING FROM SOURCE
+=====================
+
+To compile STAR from source, you must first download the latest [release](release) and uncompress it and then build it.
+
+NOTE: The following instructions only work when obtaining the source using `git`. At least until a new
+version is released which incorporates the top-level `Makefile`.
+
+Linux
+-----
+
+```bash
+# Get latest STAR source from releases
+wget https://github.com/alexdobin/STAR/archive/STAR_2.4.2a.tar.gz
+tar -xzf STAR_2.4.2a.tar.gz
+cd STAR_2.4.2a
+
+# Alternatively, get STAR source using git
+git clone https://github.com/alexdobin/STAR.git
+cd STAR
+
+# Build STAR
+make STAR
+
+# To include STAR-Fusion
+git submodule update --init --recursive
+
+# If you have a TeX environment, you may like to build the documentation
+make manual
+```
+
+Mac OS X
+--------
+
+```bash
+# Get latest STAR source from releases
+wget https://github.com/alexdobin/STAR/archive/STAR_2.4.2a.tar.gz
+tar -xzf STAR_2.4.2a.tar.gz
+cd STAR_2.4.2a
+
+# Alternatively, get STAR source using git
+git clone https://github.com/alexdobin/STAR.git
+cd STAR
+
+# To include STAR-Fusion
+git submodule update --init --recursive
+
+# Build STAR
+cd source
+make STARforMacStatic
+```
+
+If g++ compiler (true g++, not Clang sym-link) is not on the path, you will need to tell `make` where to find it:
+
+```bash
+# Build STAR
+cd source
+make STARforMacStatic CXX=/path/to/gcc
+```
+
+Developers
+==========
+
+STAR developers with write access to https://github.com/alexdobin/STAR can update the `STAR-Fusion`
+submodule to a specific tag by following these steps:
+
+```bash
+git clone --recursive https://github.com/alexdobin/STAR.git
+cd STAR
+# or:
+#
+# git clone //github.com/alexdobin/STAR.git
+# cd STAR
+# git git submodule update --init --recursive
+
+# checkout a specific tag for the submodule
+cd STAR-Fusion
+git checkout v0.3.1
+
+# Commit the change
+cd ../
+git add STAR-Fusion
+git commit -m "Updated STAR-Fusion to v0.3.1"
+
+# Push the change to GitHub
+git push
+```
+
+
+HARDWARE/SOFTWARE REQUIREMENTS
+==============================
+  * x86-64 compatible processors
+  * 64 bit Linux or Mac OS X 
+  * 30GB of RAM for human genome 
+
+
+LIMITATIONS
+===========
+This release was tested with the default parameters for human and mouse genomes.
+Please contact the author for a list of recommended parameters for much larger or much smaller genomes.
+
diff --git a/RELEASEnotes b/RELEASEnotes.md
similarity index 75%
rename from RELEASEnotes
rename to RELEASEnotes.md
index 260590d..8237aa3 100644
--- a/RELEASEnotes
+++ b/RELEASEnotes.md
@@ -1,4 +1,26 @@
+STAR 2.4.5a 2015/11/06
+======================
+
+**STAR now uses essential c++11 features. Compiling from sources requires gcc 4.7.0 or later.**
+
+Major new features:
+-------------------
+1. It is now possible to add extra sequences to the reference genome ont the fly (without re-generating the genome) by specifying 
+_--genomeFastaFiles /path/to/genome/fasta1 /path/to/genome/fasta2_ at the mapping stage. 
+
+2. By default, the order of the multi-mapping alignments for each read is not truly random.
+The _--outMultimapperOrder Random_ option outputs multiple alignments for each read in random order, 
+and also also randomizes the choice of the primary alignment from the highest scoring alignments. 
+Parameter _--runRNGseed_ can be used to set the random generator seed. 
+With this option, the ordering of multi-mapping alignments of each read, 
+and the choice of the primary alignment will vary from run to run, unless only one thread is used and the seed is kept constant.
+
+3. The --outSAMmultNmax parameter limits the number of output alignments (SAM lines) for multimappers. 
+For instance, _--outSAMmultNmax 1_ will output exactly one SAM line for each mapped read.
+
+
 STAR 2.4.2a 2015/06/19
+======================
 
 New features:
 
@@ -20,8 +42,8 @@ With --quantMode TranscriptomeSAM GeneCounts, and get both the Aligned.toTranscr
 
 
 
-################################################################################################################################################################
 STAR 2.4.1a 2015/04/17
+======================
 
 New features:
 
diff --git a/STAR-Fusion-0.1.1/LICENSE b/STAR-Fusion-0.1.1/LICENSE
deleted file mode 100644
index 0ee3825..0000000
--- a/STAR-Fusion-0.1.1/LICENSE
+++ /dev/null
@@ -1,28 +0,0 @@
-Copyright (c) 2015, STAR-Fusion
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
-  list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
-  this list of conditions and the following disclaimer in the documentation
-  and/or other materials provided with the distribution.
-
-* Neither the name of the {organization} nor the names of its
-  contributors may be used to endorse or promote products derived from
-  this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
diff --git a/STAR-Fusion-0.1.1/README.md b/STAR-Fusion-0.1.1/README.md
deleted file mode 100644
index 0e2f9c5..0000000
--- a/STAR-Fusion-0.1.1/README.md
+++ /dev/null
@@ -1,103 +0,0 @@
-# STAR-Fusion 
-
-STAR-Fusion further processes the output generated by the STAR aligner to map junction reads and spanning reads to a reference annotation set (using a GTF file, ideally the same annotation file used during the STAR genome index building process during the intial STAR setup).
-
-
-STAR should be run using options that are well suited to fusion read detection.  An example of settings similar to those used in the landmark publication "The landscape of kinase fusions in cancer" (PMID: 25204415) by Stransky et al., Nat Commun 2014 are as follows:
-
-```
-   STAR --genomeDir Hg19.fa_star_index \
-        --readFilesIn left.fq right.fq \
-        --outSAMstrandField intronMotif \
-        --outFilterIntronMotifs RemoveNoncanonicalUnannotated \
-        --outReadsUnmapped None --chimSegmentMin 15 \
-        --chimJunctionOverhangMin 15 \
-        --alignMatesGapMax 200000 \
-        --alignIntronMax 200000 \
-        --outSAMtype BAM SortedByCoordinate 
-```
-
-The output from running star will include two primary output files that contain the junction and spanning read information (see STAR documentation for precise details).
-
-      Chimeric.out.junction  : contains junction reads.
-	  Chimeric.out.sam : contains alignments for fusion-spanning reads.
-
-
-## Installation Requirements 
-
-
-  STAR-Fusion requires the following Perl module from CPAN : Set/IntervalTree.pm
-  found here:
-  http://search.cpan.org/~benbooth/Set-IntervalTree-0.02/lib/Set/IntervalTree.pm
-
-  A typical perl module installation may involve:
-  perl -MCPAN -e shell
-    install Set::IntervalTree 
- 	
-  *This CPAN module tends to install trouble-free on Linux.  Note, if you have trouble installing Set::IntervalTree on Mac OS X (as I did), try the following:  download the tarball from the above, run the perl Makefile.pl, then edit the generated 'Makefile' and remove all occurrences of '-arch i386'. Then try 'make', 'make test', and finally 'make install'.
-
-
-## Running STAR-Fusion 
-
-Run STAR-Fusion like so, using these two files above.  (Note, specify -G ref_annot.gtf if you choose to use a different annotation set than that included and used by default (gencode.v19 in the resources/ folder)
-
-      STAR-Fusion -S Chimeric.out.sam -J Chimeric.out.junction
-
-
-The output from STAR-Fusion is found as a tab-delimited file named 'star-fusion.fusion_candidates.txt', and has the following format:
-
-```
- #fusion_name    JunctionReads   SpanningFrags   LeftGene        LeftBreakpoint  LeftDistFromRefExonSplice       RightGene       RightBreakpoint RightDistFromRefExonSplice
- FIP1L1--PDGFRA  98      13      FIP1L1^ENSG00000145216.11       chr4:54292132:+ 0       PDGFRA^ENSG00000134853.7        chr4:55141092:+ 84
- BRD4--NUTM1     7       2       BRD4^ENSG00000141867.13 chr19:15364963:-        0       NUTM1^ENSG00000184507.11        chr15:34640170:+        0
- EWSR1--FLI1     5       2       EWSR1^ENSG00000182944.13        chr22:29683123:+        0       FLI1^ENSG00000151702.12 chr11:128677075:+       0
- GOPC--ROS1      82      36      GOPC^ENSG00000047932.9  chr6:117888017:-        0       ROS1^ENSG00000047936.6  chr6:117642557:-        0
- ETV6--NTRK3     8       3       ETV6^ENSG00000139083.6  chr12:12022903:+        0       NTRK3^ENSG00000140538.12        chr15:88483984:-        0
- FGFR3--TACC3    221     372     FGFR3^ENSG00000068078.13        chr4:1808661:+  0       TACC3^ENSG00000013810.14        chr4:1729704:+  269
- EWSR1--ATF1     8       3       EWSR1^ENSG00000182944.13        chr22:29683123:+        0       ATF1^ENSG00000123268.4  chr12:51208063:+        0
- HOOK3--RET      9       2       HOOK3^ENSG00000168172.4 chr8:42823357:+ 0       RET^ENSG00000165731.13  chr10:43612032:+        0
- CD74--ROS1      5       0       CD74^ENSG00000019582.10 chr5:149784243:-        0       ROS1^ENSG00000047936.6  chr6:117645578:-        0
- TMPRSS2--ETV1   10      3       TMPRSS2^ENSG00000184012.7       chr21:42866302:-        19      ETV1^ENSG00000006468.9  chr7:13975463:- 58
- AKAP9--BRAF     4       4       AKAP9^ENSG00000127914.12        chr7:91632549:+ 0       BRAF^ENSG00000157764.8  chr7:140487384:-        0
- ...
-```
-
-Note, these fusion candidates are derived solely on mapping the STAR outputs to the reference annotations.  Paralogous genes are notorious for showing up as false-positive fusion candidates. Additional filtering tools, although not included now, will be made available soon.  Even without additional filtering, STAR-Fusion provides fusion detection accuracy that is on par with the very best available fusion predictors, and is one of the most efficient.
-
-
-## Parameterization 
-
-STAR-Fusion will report all candidates having at least 1 junction read where the breakpoints match up precisely with reference exon junctions of two different genes.
-
-For those breakpoints that do not precisely match at reference exon junctions, the breakpoint fusion read support must be at least --min_novel_junction_support (default 10 reads).
-
-In the case where multiple candidate fusion breakpoints are reported, only those breakpoints having at least --min_alt_pct_junction (default 10%) of the dominant isoform junction support will be reported.
-
-Finally, it is worth noting that the counts of spanning fragments are entirely non-overlapping with the counts of the breakpoint junction reads. That is, no spanning fragment (from Chimeric.out.sam) is counted if it contains a read that is reported as evidence in the breakpoint junction candidate data (from Chimeric.out.junction).
-
-
-
-## Example data and execution:
-
-In the included test/ directory, you'll find a 'runMe.sh' script along with a data/ subdirectory.  The data/ subdirectory contains example fusion and spanning data generated from running STAR, in addition to a reference annotation file for gencode v19. Note, the reference GTF file contains only the 'exon' records instead of all lines from the original gencode annotation file; this speeds up parsing of the file and keeps the file size relatively small for including in this package.
-
-In this test/ directory, Run the sample execution like so:
-
-    ./runMe.sh
-
-which simply runs:
-
-    ../STAR-Fusion -S Chimeric.out.sam.gz -J Chimeric.out.junction.gz 
-
-and you'll find the output file 'star-fusion.fusion_candidates.txt' containing the fusion candidates in the format described above.
-
-
-
-######################
-## Acknowledgements ##
-######################
-
-This effort was largely inspired by earlier work done by Nicolas Stransky and discussions with Daniel Nicorici.
-
-STAR-Fusion is contributed by Brian Haas, Broad Institute, 2015
-
diff --git a/STAR-Fusion-0.1.1/STAR-Fusion b/STAR-Fusion-0.1.1/STAR-Fusion
deleted file mode 100755
index 670c91f..0000000
--- a/STAR-Fusion-0.1.1/STAR-Fusion
+++ /dev/null
@@ -1,755 +0,0 @@
-#!/usr/bin/env perl
-
-# contributed by Brian Haas, Broad Institute, 2015
-
-use strict;
-use warnings;
-use Carp;
-use Cwd;
-use FindBin;
-use Set::IntervalTree;
-use File::Basename;
-use Data::Dumper;
-use lib ("$FindBin::Bin/lib");
-use SAM_reader;
-use SAM_entry;
-
-use Getopt::Long qw(:config posix_default no_ignore_case bundling pass_through);
-
-my $UTILDIR = "$FindBin::Bin/util";
-
-
-=recommended_STAR_settings
-
-  # From Stransky et al. 2014   PMID: 25204415
-
-   STAR --genomeDir Hg19.fa_star_index \
-        --readFilesIn left.fq right.fq \
-        --outSAMstrandField intronMotif \
-        --outFilterIntronMotifs RemoveNoncanonicalUnannotated \
-        --outReadsUnmapped None --chimSegmentMin 15 \
-        --chimJunctionOverhangMin 15 \
-        --alignMatesGapMax 200000 \
-        --alignIntronMax 200000 \
-        --runThreadN 4 \
-        --outSAMtype BAM SortedByCoordinate 
-
-=cut
-
-
-
-## Options
-my $out_prefix = "star-fusion";
-my $chimeric_junction_file;
-my $chimeric_out_sam;
-my $ref_GTF = "$FindBin::Bin/resources/gencode.v19.annotation.gtf.exons.gz";
-my $help_flag;
-my $MIN_NOVEL_JUNCTION_SUPPORT = 10;
-my $MIN_ALT_PCT_JUNCTION = 10.0;
-
-my $usage = <<__EOUSAGE__;
-
-###################################################################################
-#
-#  Required:
-#
-#    --chimeric_out_sam|S <string>      Chimeric.out.sam file
-#
-#    --chimeric_junction|J <string>     Chimeric.out.junction file
-#
-#  Optional:
-#
-#    --ref_GTF|G <string>               reference annotation GTF file (ie. gencode.gtf)
-#
-#    --min_novel_junction_support <int>    default: 10  (minimum of 10 junction reads required if breakpoint
-#                                                        lacks involvement of only reference junctions)
-#
-#    --min_alt_pct_junction <float>        default: 10.0  (10% of the dominant isoform junction support)
-#
-#    --out_prefix|O <string>         output file prefix (default: $out_prefix)
-#
-###################################################################################
-
-
-__EOUSAGE__
-
-    ;
-
-
-&GetOptions ( 'h' => \$help_flag,
-              
-              'chimeric_out_sam|S=s' => \$chimeric_out_sam,
-              'chimeric_junction|J=s' => \$chimeric_junction_file,
-              'ref_GTF|G=s' => \$ref_GTF,
-
-              'min_novel_junction_support=i' => \$MIN_NOVEL_JUNCTION_SUPPORT,
-              'min_alt_pct_junction=f' => \$MIN_ALT_PCT_JUNCTION,
-              'out_prefix|O=s' => \$out_prefix,
-    );
-
-
-if ($help_flag) {
-    die $usage;
-}
-unless ($chimeric_out_sam && $chimeric_junction_file) {
-    die $usage;
-}
-unless (-s $ref_GTF) {
-    die "Error, cannot locate reference annotation file: $ref_GTF";
-}
-
-main: {
-    
-
-    my %chr_to_interval_tree;
-    my %chr_gene_trans_to_exons;
-
-    &parse_GTF_features($ref_GTF, \%chr_to_interval_tree, \%chr_gene_trans_to_exons);
-
-
-    ####################################
-    ## Get the evidence for fusion genes
-    ####################################
-    
-    my %junction_read_names;
-    my %junctions = &map_junction_reads_to_genes($chimeric_junction_file, \%chr_to_interval_tree, \%chr_gene_trans_to_exons, 
-                                                 \%junction_read_names);
-    
-    my %spans = &map_spanning_reads_to_genes($chimeric_out_sam, \%chr_to_interval_tree, \%chr_gene_trans_to_exons); 
-    
-    
-
-    ########################################################################
-    ## Examine each fusion gene pair, filter out fusion candidates based on 
-    ## reference gene mappings and use of reference splice junctions.
-    ########################################################################
-                      
-    my $junction_read_outfile = "$out_prefix.junction_read_names";
-    open (my $ofh_junc, ">$junction_read_outfile") or die "Error, cannot write to $junction_read_outfile";
-    
-    my $spanning_read_outfile = "$out_prefix.spanning_read_names";
-    open (my $ofh_span, ">$spanning_read_outfile") or die "Error, cannot write to $spanning_read_outfile";
-
-    my %breakpoint_to_fusion_candidates;
-    
-    foreach my $fusion_complex_name (keys %junctions) {
-        
-        my $span_token = join("--", sort split(/--/, $fusion_complex_name)); # spans are lexically ordered pairs in contrast to juncs
-
-        ## get the span support
-        my $spanning_reads_href = $spans{$span_token};
-        my @spanning_reads;
-
-        if (ref $spanning_reads_href) {
-            @spanning_reads = keys %$spanning_reads_href;
-            foreach my $span_read (@spanning_reads) {
-                print $ofh_span "$fusion_complex_name\t$span_read\n";
-            }
-        }
-        
-        my $breakpoint_info_href = $junctions{$fusion_complex_name};
-        
-        my @fusion_breakpoints = reverse sort {$breakpoint_info_href->{$a}<=>$breakpoint_info_href->{$b}} keys %$breakpoint_info_href;
-
-        my $top_breakpoint_support = -1;
-        
-        while (@fusion_breakpoints) {
-            my $best_breakpoint = shift @fusion_breakpoints;
-            my $breakpoint_count = $breakpoint_info_href->{$best_breakpoint};
-            my ($left_gene, $left_coords, $left_delta, $right_gene, $right_coords, $right_delta, $complex_name, $fusion_simple_name) = split(/;/, $best_breakpoint);
-            if ( ($left_delta == 0 && $right_delta == 0) 
-                 || 
-                 ($breakpoint_count >= $MIN_NOVEL_JUNCTION_SUPPORT) 
-                ) {
-                
-                if ($top_breakpoint_support < 0) {
-                    $top_breakpoint_support = $breakpoint_count;
-                }
-                else {
-                    my $pct_top_brkpt_support = $breakpoint_count / $top_breakpoint_support * 100;
-                    if ($pct_top_brkpt_support < $MIN_ALT_PCT_JUNCTION) { 
-                        # not enough evidence compared to a dominant junction call.
-                        next;
-                    }
-                }
-                
-                # prune any junction reads from the span support for this fusion.
-                my %local_spanning_reads = map { + $_ => 1 } @spanning_reads;
-                
-                my $junction_reads_href = $junction_read_names{$best_breakpoint};
-                foreach my $junction_read (keys %$junction_reads_href) {
-                    print $ofh_junc "$fusion_complex_name\t$best_breakpoint\t$junction_read\n";
-                    if (exists $local_spanning_reads{$junction_read}) {
-                        delete $local_spanning_reads{$junction_read};
-                    }
-                }
-                my $span_count = scalar(keys %local_spanning_reads);
-                
-                
-                my $fusion_candidate = { fusion_simple_name => $fusion_simple_name,
-                                         fusion_complex_name => $fusion_complex_name,
-                                         
-                                         junction_count => $breakpoint_count,
-                                         spanning_count => $span_count,
-
-                                         left_gene => $left_gene,
-                                         left_coords => $left_coords,
-                                         left_delta => $left_delta, # dist to ref splice junction
-                                         
-                                         right_gene => $right_gene,
-                                         right_coords => $right_coords,
-                                         right_delta => $right_delta, # dist to ref splice junction
-                                         
-                };
-                
-                my $breakpoint_coords_token = join("$;", $left_coords, $right_coords);
-
-                push (@{$breakpoint_to_fusion_candidates{$breakpoint_coords_token}}, $fusion_candidate);
-                                
-            }
-
-        }
-    }
-    
-    close $ofh_junc;
-    close $ofh_span;
-
-
-    ####################################################################
-    ## Further filter fusion candidates and generate final predictions.
-    ## Breakpoint-focused
-    ####################################################################
-    
-
-    my $fusion_predictions_outfile = "$out_prefix.fusion_candidates.txt";
-    open (my $ofh, ">$fusion_predictions_outfile") or die "Error, cannot write to file: $fusion_predictions_outfile";
-    
-    print STDERR "-outputting fusion candidates to file: $fusion_predictions_outfile\n";
-
-    # print header
-    print $ofh join("\t", "#fusion_name", "JunctionReads", "SpanningFrags", 
-                    "LeftGene", "LeftBreakpoint",  "LeftDistFromRefExonSplice",
-                    "RightGene", "RightBreakpoint", "RightDistFromRefExonSplice") . "\n";
-    
-    
-    # examining fusions based on the specific junction breakpoint, regardless of genes assigned to.
-    
-    foreach my $fusion_candidates_aref (values %breakpoint_to_fusion_candidates) {
-        
-        ## all have the same junction support,
-        #  so output the one fusion that has the greatest span support.
-
-        my @candidates_at_breakpoint = reverse sort { $a->{spanning_count} <=> $b->{spanning_count}
-                                                      ||
-                                                          length($b->{fusion_simple_name}) <=> length($a->{fusion_simple_name}) # tie-break on length of name, preferring shorter one (basically penalizing the annotated fusion neighbors)
-        } @$fusion_candidates_aref;
-        
-        my $fusion_candidate = shift @candidates_at_breakpoint;
-        
-        print $ofh join("\t", $fusion_candidate->{fusion_simple_name}, 
-                        $fusion_candidate->{junction_count}, $fusion_candidate->{spanning_count},
-                        $fusion_candidate->{left_gene}, $fusion_candidate->{left_coords}, $fusion_candidate->{left_delta}, 
-                        $fusion_candidate->{right_gene}, $fusion_candidate->{right_coords}, $fusion_candidate->{right_delta}) . "\n";
-        
-    }
-    
-    
-    print STDERR "\n\t* process complete.  See output: $fusion_predictions_outfile\n\n";
-    
-    close $ofh;
-    
-
-    exit(0);
-
-    
-}
-
-####
-sub make_hidden {
-    my ($file) = @_;
-
-    my $d = dirname($file);
-    my $f = basename($file);
-
-    my $h = "$d/.$f";
-
-    return($h);
-}
-
-
-####
-sub parse_GTF_features {
-    my ($annot_gtf_file, $chr_to_interval_tree_href, $chr_gene_trans_to_exons_href) = @_;
-    
-    if ($annot_gtf_file =~ /\.gz$/) {
-        $annot_gtf_file = "gunzip -c $annot_gtf_file | ";
-    }
-
-
-    my %chr_to_gene_coords;
-    print STDERR "-parsing $annot_gtf_file\n";
-    open (my $fh, $annot_gtf_file) or die "Error, cannot open file $annot_gtf_file";
-    while (<$fh>) {
-        chomp;
-        unless (/\w/) { next; }
-        if (/^\#/) { next; }
-        s/^>//;
-        my @x = split(/\t/);
-        
-        unless ($x[2] eq "exon") { next; }
-        
-        my $info = $x[8];
-        $info =~ /gene_id \"([^\"]+)/ or die "Error, cannot extract gene_id from $_ [specifically from: $info]";
-        my $gene_id = $1 or die "Error, no gene_id from $_";
-        
-        
-        if ($info =~ /gene_name \"([^\"]+)/) {
-            # use gene name instead
-            my $gene_name = $1;
-            $gene_id = join("^", $gene_name, $gene_id);
-        }
-        
-        $info =~ /transcript_id \"([^\"]+)/ or die "Error, cannot extract transcript_id from $_";
-        my $transcript_id = $1 or die "Error, no trans id from $_";
-        
-        my ($lend, $rend) = ($x[3], $x[4]);
-        my $chr = $x[0];
-        my $orient = $x[6];
-        
-        
-        my $exon_struct = { 
-            
-            gene => $gene_id,
-            transcript => $transcript_id,
-            chr => $chr,
-            lend => $lend,
-            rend => $rend,
-            orient => $orient,
-        
-        };
-        
-        push (@{$chr_gene_trans_to_exons_href->{$chr}->{$gene_id}->{$transcript_id}}, $exon_struct);
-        
-        push (@{$chr_to_gene_coords{$chr}->{$gene_id}}, $lend, $rend);
-        
-    }
-    close $fh;
-    
-    
-    print STDERR "-building interval tree for fast searching of gene overlaps\n";
-    ## Build interval trees
-    foreach my $chr (keys %chr_to_gene_coords) {
-
-        my $i_tree = $chr_to_interval_tree_href->{$chr} = Set::IntervalTree->new;
-        
-        foreach my $gene_id (keys %{$chr_to_gene_coords{$chr}}) {
-            
-            my @coords = sort {$a<=>$b} @{$chr_to_gene_coords{$chr}->{$gene_id}};
-            my $lend = shift @coords;
-            my $rend = pop @coords;
-
-            $i_tree->insert($gene_id, $lend, $rend);
-        }
-    }
-    
-    return;
-}
-    
-
-####
-sub find_exon_junction_matches {
-    my ($chr, $coord, $orient, $left_or_right, $chr_to_interval_tree_href, $chr_gene_trans_to_exons_href) = @_;
-    
-        
-    # two options, depending on sense or antisense alignment (antisense orientation just an artifiact of DS trans assembly)
-    
-    #          L                               R
-    #        ------> gt...................ag -------->              
-    #
-    #   |=================>              |==================>
-    #         gene A                            gene B
-    #
-    #        <------ ......................<---------
-    #           R                               L
-    # 
-    #  if left:
-    #      can be donor matching sense of geneA
-    #      can be acceptor matching antisense of geneB
-    #  if right:
-    #      can be acceptor for sense geneB
-    #      can be donor matching antisesnse of geneA
-    #
-    
-    my @exon_hits;
-
-    foreach my $gene_id (&get_overlapping_genes($chr_to_interval_tree_href, $chr, $coord - 1, $coord + 1)) {
-        
-        foreach my $transcript_id (keys %{$chr_gene_trans_to_exons_href->{$chr}->{$gene_id}}) {
-            
-            my @exons = @{$chr_gene_trans_to_exons_href->{$chr}->{$gene_id}->{$transcript_id}};
-            
-            @exons = sort {$a->{lend}<=>$b->{lend}} @exons;
-
-            my $trans_lend = $exons[0]->{lend};
-            my $trans_rend = $exons[$#exons]->{rend};
-            
-            unless ($trans_lend <= $coord && $trans_rend >= $coord) { 
-                # no overlap
-                next;
-            }
-            
-            ## exclude first and last exons, only looking at internal boundaries
-            $exons[0]->{terminal} = 1;
-            $exons[$#exons]->{terminal} = 1;
-
-            my $num_exons = scalar(@exons);
-            my $counter= 0;
-            foreach my $exon (@exons) {
-                $counter++;
-                $exon->{exon_num} = "$counter/$num_exons";
-            }
-            
-                        
-            foreach my $exon (@exons) {
-                
-                my $exon_lend = $exon->{lend};
-                my $exon_rend = $exon->{rend};
-                my $exon_orient = $exon->{orient};
-                
-                my ($exon_end5, $exon_end3) = ($exon_orient eq '+') ? ($exon_lend, $exon_rend) : ($exon_rend, $exon_lend);
-                
-
-                if ($exon_lend <= $coord && $exon_rend >= $coord ) {
-                    # annotated exon overlaps transcript
-                    
-                    my $sense_or_antisense;
-                    my $exon_coord;
-                    my $align_coord;
-                    
-                    # sense alignment matching
-                    if ($exon_orient eq $orient) {
-                        
-                        $sense_or_antisense = 'sense';
-                        
-                        if ($left_or_right eq 'left') {
-                            # examine donor sites
-                            $exon_coord = $exon_end3;
-                        }
-                        elsif ($left_or_right eq 'right') {
-                            # examine acceptor sites
-                            $exon_coord = $exon_end5;
-                        }
-                    }
-
-                    else {
-                        # antisense orientation to gene
-                        
-                        $sense_or_antisense = 'antisense';
-                        
-                        if ($left_or_right eq 'left') {
-                            # examine donor sites
-                            $exon_coord = $exon_end5;
-                        }
-                        elsif ($left_or_right eq 'right') {
-                            $exon_coord = $exon_end3;
-                        }    
-                    }
-                    
-                    my $delta = abs($coord - $exon_coord);
-                    
-                    
-                    push (@exon_hits, { delta => $delta,
-                                        exon => $exon,
-                                                                                
-                                        gene_id => $exon->{gene},
-                                        
-                                        # below for debugging
-                                        pt_align => $coord,
-                                        pt_exon => $exon_coord,
-                                        sense_or_antisense => $sense_or_antisense,
-                                        
-                                        chr => $chr,
-                                        
-                          });
-                    
-                }
-            }
-            
-        }
-    }
-    
-    my @hits_ret;
-    
-    if (@exon_hits) {
-
-        #use Data::Dumper;  print Dumper(\@hits); print Dumper($align_struct);
-        
-        @exon_hits = sort {$a->{delta}<=>$b->{delta}} @exon_hits;
-        
-        #use Data::Dumper;
-        #print STDERR Dumper(\@hits);
-        
-        # only best per gene
-        my %seen;
-        
-        foreach my $hit (@exon_hits) {
-            my $gene_id = $hit->{gene_id};
-            if (! $seen{$gene_id}) {
-                push (@hits_ret, $hit);
-                $seen{$gene_id} = 1;
-            }
-        }
-        
-    }
-    
-    return(@hits_ret);
-    
-}
-
-
-####
-sub get_overlapping_genes {
-    my ($chr_to_interval_tree_href, $chr, $lend, $rend) = @_;
-
-    my $interval_tree = $chr_to_interval_tree_href->{$chr};
-
-    unless (ref $interval_tree) {
-        # no genes on that chr?
-        return();
-    }
-
-    my $overlaps = $interval_tree->fetch($lend, $rend);
-
-    return(@$overlaps);
-}
-
-
-####
-sub map_junction_reads_to_genes {
-    my ($junctions_file, $chr_to_interval_tree_href, $chr_gene_trans_to_exons_href, 
-        $junction_read_names_href, $gene_id_to_name_href) = @_;
-    
-    print STDERR "-mapping junction reads to genes\n";
-
-    my $junctions_w_gene_info_file = "$out_prefix.junction_breakpts_to_genes.txt";
-    open (my $ofh, ">$junctions_w_gene_info_file") or die "Error, cannot write to file $junctions_w_gene_info_file";
-    
-    
-    if ($junctions_file =~ /\.gz$/) {
-        $junctions_file = "gunzip -c $junctions_file | ";
-    }
-    
-    my %junction_info;
-    
-    open (my $fh, $junctions_file) or die "Error, cannot open file $junctions_file";
-    while (<$fh>) {
-        chomp;
-        my $line = $_;
-        my @x = split(/\t/);
-        
-        my $junction_read_name = $x[9];
-        
-        my ($chrA, $coordA, $orientA) = ($x[0], $x[1], $x[2]);
-        $coordA = ($orientA eq '+') ? --$coordA : ++$coordA;
-        
-        my ($chrB, $coordB, $orientB) = ($x[3], $x[4], $x[5]);
-        $coordB = ($orientB eq '+') ? ++$coordB : --$coordB;
-        
-        my @A_hits = &find_exon_junction_matches($chrA, $coordA, $orientA, 'left', $chr_to_interval_tree_href, $chr_gene_trans_to_exons_href);
-
-        my @B_hits = &find_exon_junction_matches($chrB, $coordB, $orientB, 'right', $chr_to_interval_tree_href, $chr_gene_trans_to_exons_href);
-
-        #print STDERR "A: " . Dumper(\@A_hits);
-        #print STDERR "B: " . Dumper(\@B_hits);
-
-        foreach my $left_possibility (@A_hits) {
-
-            foreach my $right_possibility (@B_hits) {
-                        
-                my ($left_entry, $right_entry) = ($left_possibility, $right_possibility);
-                    
-                # ensure consistent orientation
-                unless ($left_entry->{sense_or_antisense} eq $right_entry->{sense_or_antisense}) {
-                    next;
-                }
-
-                if ($left_entry->{gene_id} eq $right_entry->{gene_id}) {
-                    # no selfies
-                    next;
-                }
-
-                if ($left_entry->{sense_or_antisense} eq 'antisense') {
-                    # swap em
-                    ($left_entry, $right_entry) = ($right_entry, $left_entry);
-                }
-                
-                my $left_gene_id = $left_entry->{gene_id};
-                my ($left_gene_name, $left_id) = split(/\^/, $left_gene_id);
-                
-                my $right_gene_id = $right_entry->{gene_id};
-                my ($right_gene_name, $right_id) = split(/\^/, $right_gene_id);
-                
-                my $fusion_simple_name = join("--", $left_gene_name, $right_gene_name);
-                my $fusion_complex_name = join("--", $left_gene_id, $right_gene_id);
-                
-                my @at_exon_junctions = ($left_gene_id, 
-                                         $left_entry->{chr} . ":" . $left_entry->{pt_align} . ":" . $left_entry->{exon}->{orient},
-                                         $left_entry->{delta}, 
-
-                                         $right_gene_id, 
-                                         $right_entry->{chr} . ":" . $right_entry->{pt_align} . ":" . $right_entry->{exon}->{orient},
-                                         $right_entry->{delta}, 
-                                         $fusion_complex_name,
-                                         $fusion_simple_name);
-                
-                
-                my $junction_text = join(";", @at_exon_junctions);
-                push (@x, $junction_text);
-                
-                # both at exon junctions
-                $junction_info{$fusion_complex_name}->{$junction_text}++;
-                
-                $junction_read_names_href->{$junction_text}->{$junction_read_name}++; # track junction read name to fusion name
-                $junction_read_names_href->{$junction_read_name}++; # ignore in spanning read set, working double-duty w/ data structure. 
-            
-            }
-        }
-     
-        print $ofh join("\t", @x) . "\n";
-    }
-    
-    close $ofh;
-    
-    
-    return (%junction_info);
-    
-}
-
-
-####
-sub map_spanning_reads_to_genes {
-    my ($chimeric_out_sam, $chr_to_interval_tree_href, $chr_gene_trans_to_exons_href) = @_;
-    
-    
-    my $read_to_spans_file = "$out_prefix.discordant_spans_to_genes.txt";
-    open (my $ofh, ">$read_to_spans_file") or die "Error, cannot open file $read_to_spans_file";
-    
-    my %span_pair_counter;
-    
-
-    my $sam_reader = new SAM_reader($chimeric_out_sam);
-    
-    my @read_info;
-    my $prev_core_read_name = "";
-    
-    my $DEBUG_SPAN_FLAG = 0;
-    my $test_ofh;
-    
-    if ($DEBUG_SPAN_FLAG) {
-        open ($test_ofh, ">test.out") or die $!;
-    }
-    
-    while (my $sam_entry = $sam_reader->get_next()) {
-        
-        my $core_read_name = $sam_entry->get_core_read_name();
-        my $full_read_name = $sam_entry->reconstruct_full_read_name();
-        
-        print $test_ofh "// read: $full_read_name\n" if $DEBUG_SPAN_FLAG;
-
-        if ($core_read_name ne $prev_core_read_name && @read_info) {
-            &describe_read_pair_info($prev_core_read_name, \@read_info, $ofh, \%span_pair_counter);
-            @read_info = ();
-        }
-
-
-        $full_read_name =~ m|/([12])$| or die "Error, cannot decipher read name $full_read_name as /1 or /2 ";
-        my $read_dir = $1;
-        
-        my $chr = $sam_entry->get_scaffold_name();
-
-        unless (exists $chr_to_interval_tree_href->{$chr}) { 
-            
-             # no annotations to search overlaps of.
-            print $test_ofh "-warning: no interval tree features on chr: $chr\n" if $DEBUG_SPAN_FLAG;
-            next; 
-        }
-        
-        my ($genome_coords_aref, $read_coords_aref) = $sam_entry->get_alignment_coords();
-
-        my $found_overlap = 0;
-        foreach my $exon_segment (@$genome_coords_aref) {
-            my ($lend, $rend) = @$exon_segment;
-            if ($lend == $rend) { next; } # no single base interval searches
-            my $overlaps_aref = $chr_to_interval_tree_href->{$chr}->fetch($lend, $rend);
-            if (@$overlaps_aref) {
-                print $test_ofh "$full_read_name coords $lend-$rend overlap: " . join(",", @$overlaps_aref) . "\n" if $DEBUG_SPAN_FLAG;
-                &add_overlapping_genes(\@read_info, $overlaps_aref, $read_dir);                
-                $found_overlap = 1;
-            }
-        }
-        unless ($found_overlap) {
-            print $test_ofh "$full_read_name has no feature overlap.\n" if $DEBUG_SPAN_FLAG;
-        }
-        
-        $prev_core_read_name = $core_read_name;
-    }
-
-    # get last one
-    &describe_read_pair_info($prev_core_read_name, \@read_info, $ofh, \%span_pair_counter);
-
-    #use Data::Dumper; print STDERR Dumper(\%span_pair_counter);
-    
-    return(%span_pair_counter);
-    
-}
-
-
-####
-sub describe_read_pair_info {
-    my ($read_name, $read_info_aref, $ofh, $span_pair_counter_href) = @_;
-    
-    my @read_1_genes;
-    my @read_2_genes;
-
-    my $read_1_genes_href = $read_info_aref->[1];
-    if ($read_1_genes_href) {
-        @read_1_genes = sort keys (%$read_1_genes_href);
-    }
-
-    my $read_2_genes_href = $read_info_aref->[2];
-    if ($read_2_genes_href) {
-        @read_2_genes = sort keys (%$read_2_genes_href);
-    }
-    
-    if (@read_1_genes && @read_2_genes) {
-            
-        my %seen;
-        foreach my $read_1_gene (@read_1_genes) {
-            foreach my $read_2_gene (@read_2_genes) {
-                my $fusion_token = join("--", sort ($read_1_gene, $read_2_gene));
-                if ($seen{$fusion_token}) { next; } # just in case, don't overcount
-                $seen{$fusion_token} = 1;
-                
-                print $ofh "$read_name\t$fusion_token\n";
-            
-                $span_pair_counter_href->{$fusion_token}->{$read_name}++;
-            }
-        }
-        
-        
-    }
-    
-    return;
-}    
-        
-
-####
-sub add_overlapping_genes {
-    my ($read_info_aref, $overlaps_aref, $read_dir) = @_;
-    
-    foreach my $gene (@$overlaps_aref) {
-        $read_info_aref->[$read_dir]->{$gene} = 1;
-    }
-
-    return;
-}
diff --git a/STAR-Fusion-0.1.1/lib/SAM_entry.pm b/STAR-Fusion-0.1.1/lib/SAM_entry.pm
deleted file mode 100644
index cf140be..0000000
--- a/STAR-Fusion-0.1.1/lib/SAM_entry.pm
+++ /dev/null
@@ -1,544 +0,0 @@
-package SAM_entry;
-
-use strict;
-use warnings;
-use Carp;
-
-
-
-sub new {
-	my $packagename = shift;
-	my ($line) = @_;
-
-	unless (defined $line) {
-		confess "Error, need sam text line as parameter";
-	}
-
-	chomp $line;
-
-	my @fields = split(/\t/, $line);
-	
-	my $self = {
-        _line => $line,
-		_fields => [@fields],
-	};
-	
-	bless ($self, $packagename);
-	
-	return($self);
-}
-
-
-####
-sub get_original_line {
-    my $self = shift;
-    return($self->{_line});
-}
-
-####
-sub get_fields {
-	my $self = shift;
-	return (@{$self->{_fields}});
-}
-
-
-####
-sub get_read_name {
-	my $self = shift;
-	return ($self->{_fields}->[0]);
-}
-
-####
-sub reconstruct_full_read_name {
-	my $self = shift;
-
-	my $read_name = $self->get_core_read_name();
-
-	if ($self->is_first_in_pair()) {
-		$read_name .= "/1";
-	}
-	elsif ($self->is_second_in_pair()) {
-		$read_name .= "/2";
-	}
-
-	return($read_name);
-}
-
-
-####
-sub get_core_read_name {
-	my $self = shift;
-	my $read_name = $self->get_read_name();
-	my $core_read_name = $read_name;
-
-	$core_read_name =~ s|/\d$||;
-	
-	return($core_read_name);
-}
-
-
-
-####
-sub get_scaffold_name {
-	my $self = shift;
-	return($self->{_fields}->[2]);
-}
-
-####
-sub get_aligned_position {
-	my $self = shift;
-	return($self->{_fields}->[3]);
-}
-
-sub get_scaffold_position { # preferred
-	my $self = shift;
-	return($self->get_aligned_position());
-}
-
-
-####
-sub get_cigar_alignment {
-	my $self = shift;
-	return($self->{_fields}->[5]);
-}
-
-###
-sub get_genome_span {
-    my $self = shift;
-    my ($genome_aref, $read_aref) = $self->get_alignment_coords();
-
-    my @coords;
-    foreach my $genome_coordset (@$genome_aref) {
-        push (@coords, @$genome_coordset);
-    }
-
-    @coords = sort {$a<=>$b} @coords;
-
-    my $min_coord = shift @coords;
-    my $max_coord = pop @coords;
-
-    return($min_coord, $max_coord);
-}
-
-
-####
-sub get_alignment_coords {
-	my $self = shift;
-
-	my $genome_lend = $self->get_aligned_position();
-
-	my $alignment = $self->get_cigar_alignment();
-
-	my $query_lend = 0;
-
-	my @genome_coords;
-	my @query_coords;
-
-
-	$genome_lend--; # move pointer just before first position.
-	
-	while ($alignment =~ /(\d+)([A-Z])/g) {
-		my $len = $1;
-		my $code = $2;
-		
-		unless ($code =~ /^[MSDNIH]$/) {
-			confess "Error, cannot parse cigar code [$code] " . $self->toString();
-		}
-		
-		# print "parsed $len,$code\n";
-		
-		if ($code eq 'M') { # aligned bases match or mismatch
-			
-			my $genome_rend = $genome_lend + $len;
-			my $query_rend = $query_lend + $len;
-			
-			push (@genome_coords, [$genome_lend+1, $genome_rend]);
-			push (@query_coords, [$query_lend+1, $query_rend]);
-			
-			# reset coord pointers
-			$genome_lend = $genome_rend;
-			$query_lend = $query_rend;
-			
-		}
-		elsif ($code eq 'D' || $code eq 'N') { # insertion in the genome or gap in query (intron, perhaps)
-			$genome_lend += $len;
-			
-		}
-
-		elsif ($code eq 'I'  # gap in genome or insertion in query 
-               ||
-               $code eq 'S' || $code eq 'H')  # masked region of query
-        { 
-            $query_lend += $len;
-
-		}
-	}
-
-
-    ## see if reverse strand alignment - if so, must revcomp the read matching coordinates.
-    if ($self->get_query_strand() eq '-') {
-    
-        my $read_len = length($self->get_sequence());
-        unless ($read_len) {
-            confess "Error, no read length obtained from entry: " . $self->get_original_line();
-        }
-
-        my @revcomp_coords;
-        foreach my $coordset (@query_coords) {
-            my ($lend, $rend) = @$coordset;
-
-            my $new_lend = $read_len - $lend + 1;
-            my $new_rend = $read_len - $rend + 1;
-            
-            push (@revcomp_coords, [$new_lend, $new_rend]);
-        }
-            
-        @query_coords = @revcomp_coords;
-
-    }
-    
-
-
-	return(\@genome_coords, \@query_coords);
-}
-
-
-####
-sub get_mate_scaffold_name {
-	my $self = shift;
-   
-	return($self->{_fields}->[6]);
-}
-
-
-####
-sub set_mate_scaffold_name {
-	my $self = shift;
-	my $mate_scaffold_name = shift;
-	
-	$self->{_fields}->[6] = $mate_scaffold_name;
-	
-	return;
-}
-
-
-####
-sub get_mate_scaffold_position {
-	my $self = shift;
-
-	return($self->{_fields}->[7]);
-}
-
-
-####
-sub set_mate_scaffold_position {
-	my $self = shift;
-	my $scaff_pos = shift;
-   
-	$self->{_fields}->[7] = $scaff_pos;
-	
-	return;
-}
-
-
-####
-sub toString {
-	my $self = shift;
-	my @fields = @{$self->{_fields}};
-
-	if ($self->is_paired()) {
-		$fields[0] = $self->get_core_read_name();
-	}
-
-	return( join("\t", @fields));
-}
-
-
-####
-sub get_mapping_quality {
-	my $self = shift;
-	return($self->{_fields}->[4]);
-}
-
-
-####
-sub get_sequence {
-	my $self = shift;
-	return($self->{_fields}->[9]);
-}
-
-####
-sub get_quality_scores {
-	my $self = shift;
-	return($self->{_fields}->[10]);
-}
-
-
-####
-sub get_inferred_insert_size {
-    my $self = shift;
-    
-    # should probably check to see if it's a paired read or not...  user beware
-    return($self->{_fields}->[8]);
-}
-
-
-
-###################
-## Flag Processing
-###################
-
-# from sam format spec:
-
-=flag_description
-
-Flag Description
-0x0001 the read is paired in sequencing, no matter whether it is mapped in a pair
-0x0002 the read is mapped in a proper pair (depends on the protocol, normally inferred during alignment) 1
-0x0004 the query sequence itself is unmapped
-0x0008 the mate is unmapped 1
-0x0010 strand of the query (0 for forward; 1 for reverse strand)
-0x0020 strand of the mate 1
-0x0040 the read is the first read in a pair 1,2
-0x0080 the read is the second read in a pair 1,2
-0x0100 the alignment is not primary (a read having split hits may have multiple primary alignment records)
-0x0200 the read fails platform/vendor quality checks
-0x0400 the read is either a PCR duplicate or an optical duplicate
-
-1. Flag 0x02, 0x08, 0x20, 0x40 and 0x80 are only meaningful when flag 0x01 is present.
-2. If in a read pair the information on which read is the first in the pair is lost in the upstream analysis, flag 0x01 shuld
-be present and 0x40 and 0x80 are both zero.
-
-=cut
-
-
-####
-sub get_flag {
-	my $self = shift;
-	my $flag = $self->{_fields}->[1];
-	return($flag);
-}
-
-sub set_flag {
-	my $self = shift;
-	my $flag = shift;
-
-	unless (defined $flag) {
-		confess "Error, need flag value";
-	}
-
-	$self->{_fields}->[1] = $flag;
-	return;
-}
-
-####
-sub is_paired {
-	my $self = shift;
-	return($self->_get_bit_val(0x0001));
-}
-
-sub set_paired {
-	my $self = shift;
-	my $bit_val = shift;
-	
-	$self->_set_bit_val(0x0001, $bit_val);
-	
-	return;
-}
-
-####
-sub is_proper_pair {
-	my $self = shift;
-	return($self->_get_bit_val(0x0002));
-}
-
-sub set_proper_pair {
-	my $self = shift;
-	my $bit_val = shift;
-	
-	$self->_set_bit_val(0x0002, $bit_val);
-	return;
-}
-
-####
-sub is_query_unmapped {
-	my $self = shift;
-	return($self->_get_bit_val(0x0004));
-}
-
-sub set_query_unmapped {
-	my $self = shift;
-	my $bit_val = shift;
-
-	$self->_set_bit_val(0x0004, $bit_val);
-}
-
-
-####
-sub is_mate_unmapped {
-	my $self = shift;
-	return($self->_get_bit_val(0x0008));
-}
-
-sub set_mate_unmapped {
-	my $self = shift;
-	my $bit_val = shift;
-	
-	return($self->_set_bit_val(0x0008, $bit_val));
-}
-
-####
-sub get_query_strand {
-	my $self = shift;
-	
-	my $strand = ($self->_get_bit_val(0x0010)) ? '-' : '+';
-	return($strand);
-}
-
-####
-sub get_query_transcribed_strand {
-	my $self = shift;
-    my ($SS_lib_type) = @_;
-    
-    unless ($SS_lib_type) {
-        confess "Error, SS_lib_type required as a parameter, possible values: RF,FR,F,R " . $self->toString();
-    }
-    
-    
-	my $aligned_strand = $self->get_query_strand();
-    my $opposite_strand = ($aligned_strand eq '+') ? '-' : '+';
-    
-    my $transcribed_strand;
-    
-    if (! $self->is_paired()) {
-        
-        ## UNPAIRED or SINGLE READS
-        unless ($SS_lib_type =~ /^(F|R)$/) {
-            confess "Error, cannot have $SS_lib_type library type with unpaired reads " . $self->toString();
-        }
-        
-        $transcribed_strand = ($SS_lib_type eq "F") ? $aligned_strand : $opposite_strand;
-    }
-    else {
-        
-        ## paired RNA-Seq reads:  left fragment is on the 3' end revcomped, and right fragment is at the 5' end sense strand.
-        
-        unless ($SS_lib_type =~ /^(FR|RF)$/) {
-            confess "Error, cannot have $SS_lib_type library type with paired reads " . $self->toString();
-        }
-                
-        if ($self->is_first_in_pair()) {
-            $transcribed_strand = ($SS_lib_type eq "FR") ? $aligned_strand : $opposite_strand;
-        }
-        else {
-            # second pair
-            $transcribed_strand = ($SS_lib_type eq "FR") ? $opposite_strand : $aligned_strand;
-        }
-    }
-    
-    
-    return($transcribed_strand);
-    
-}
-
-
-
-
-sub set_query_strand {
-	my $self = shift;
-	my $strand = shift;
-
-	unless ($strand eq '+' || $strand eq '-') {
-		confess "Error, strand value must be [+-]";
-	}
-
-	my $bit_val = ($strand eq '+') ? 0 : 1;
-	$self->_set_bit_val(0x0010, $bit_val);
-}
-
-####
-sub get_mate_strand {
-	my $self = shift;
-	
-	my $strand = ($self->_get_bit_val(0x0020)) ? '-' : '+';
-	return($strand);
-}
-
-sub set_mate_strand {
-	my $self = shift;
-	my $strand = shift;
-
-	unless ($strand eq '+' || $strand eq '-') {
-		confess "Error, strand value must be [+-]";
-	}
-
-	my $bit_val = ($strand eq '+') ? 0 : 1;
-	$self->_set_bit_val(0x0020, $bit_val);
-}
-
-####
-sub is_first_in_pair {
-	my $self = shift;
-	return($self->_get_bit_val(0x0040));
-}
-
-sub set_first_in_pair {
-	my $self = shift;
-	my $bit_val = shift;
-	
-	$self->_set_bit_val(0x0040, $bit_val);
-	return;
-}
-
-####
-sub is_second_in_pair {
-	my $self = shift;
-	return($self->_get_bit_val(0x0080));
-}
-
-
-sub set_second_in_pair {
-	my $self = shift;
-	my $bit_val = shift;
-
-	$self->_set_bit_val(0x0080, $bit_val);
-	return;
-}
-
-
-
-####
-sub _get_bit_val {
-	my $self = shift;
-	my ($bit_position) = @_;
-
-	my $flag = $self->get_flag();
-	return($flag & $bit_position);
-}
-
-
-####
-sub _set_bit_val {
-	my $self = shift;
-	my ($bit_position, $bit_val) = @_;
-
-	unless (defined $bit_position && defined $bit_val) {
-		confess "Error, need bit position and value";
-	}
-	
-	my $flag = $self->get_flag();
-
-	if ($bit_val) {
-		$flag |= $bit_position;
-	}
-	else {
-		# erase bit
-		$flag &= ~$bit_position;
-	}
-	
-	$self->set_flag($flag);
-}
-
-
-1; #EOM
-
diff --git a/STAR-Fusion-0.1.1/lib/SAM_reader.pm b/STAR-Fusion-0.1.1/lib/SAM_reader.pm
deleted file mode 100644
index d61c9b2..0000000
--- a/STAR-Fusion-0.1.1/lib/SAM_reader.pm
+++ /dev/null
@@ -1,109 +0,0 @@
-package SAM_reader;
-
-use strict;
-use warnings;
-use Carp;
-
-use SAM_entry;
-
-sub new {
-	my $packagename = shift;
-	my $filename = shift; 
-
-	unless ($filename) {
-		confess "Error, need SAM filename as parameter";
-	}
-	
-	my $self = { filename => $filename,
-				 _next => undef,
-				 _fh =>  undef,
-	};
-
-	bless ($self, $packagename);
-
-	$self->_init();
-
-	return($self);
-}
-
-
-####
-sub _init {
-	my ($self) = @_;
-    
-    if ($self->{filename} =~ /\.bam$/) {
-        open ($self->{_fh}, "samtools view $self->{filename} |") or confess "Error, cannot open file " . $self->{filename};
-    }
-    elsif ($self->{filename} =~ /\.gz$/) {
-        open ($self->{_fh}, "gunzip -c $self->{filename} | ") or confess "Error, cannot open file " . $self->{filename};
-    }
-    else {
-        open ($self->{_fh}, $self->{filename}) or confess "Error, cannot open file " . $self->{filename};
-    }
-    
-	$self->_advance();
-
-	return;
-}
-
-####
-sub _advance {
-	my ($self) = @_;
-
-	my $fh = $self->{_fh};
-
-	my $next_line = <$fh>;
-	while (defined ($next_line) && ($next_line =~ /^\@/ || $next_line !~ /\w/)) {  ## skip over sam headers
-		$next_line = <$fh>;
-	}
-	
-	if ($next_line) {
-		$self->{_next} = new SAM_entry($next_line);
-	}
-	else {
-		$self->{_next} = undef;
-	}
-	
-	return;
-}
-
-####
-sub has_next {
-	my $self = shift;
-	
-	if (defined $self->{_next}) {
-		return(1);
-	}
-	else {
-		return(0);
-	}
-}
-
-
-####
-sub get_next {
-	my $self = shift;
-	
-	my $next_entry = $self->{_next};
-
-	$self->_advance();
-	
-	if (defined $next_entry) {
-		return($next_entry);
-	}
-	else {
-		return(undef);
-	}
-}
-
-####
-sub preview_next {
-	my $self = shift;
-	return($self->{_next});
-}
-
-
-1;
-
-	
-	
diff --git a/STAR-Fusion-0.1.1/notes b/STAR-Fusion-0.1.1/notes
deleted file mode 100644
index e000378..0000000
--- a/STAR-Fusion-0.1.1/notes
+++ /dev/null
@@ -1 +0,0 @@
-git clone https://github.com/STAR-Fusion/STAR-Fusion.git
diff --git a/STAR-Fusion-0.1.1/test/Chimeric.out.junction.gz b/STAR-Fusion-0.1.1/test/Chimeric.out.junction.gz
deleted file mode 100644
index 45f203a..0000000
Binary files a/STAR-Fusion-0.1.1/test/Chimeric.out.junction.gz and /dev/null differ
diff --git a/STAR-Fusion-0.1.1/test/Chimeric.out.sam.gz b/STAR-Fusion-0.1.1/test/Chimeric.out.sam.gz
deleted file mode 100644
index 0f1b186..0000000
Binary files a/STAR-Fusion-0.1.1/test/Chimeric.out.sam.gz and /dev/null differ
diff --git a/STAR-Fusion-0.1.1/test/cleanMe.sh b/STAR-Fusion-0.1.1/test/cleanMe.sh
deleted file mode 100755
index 0e7afa4..0000000
--- a/STAR-Fusion-0.1.1/test/cleanMe.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-
-rm -f ./.star-fusion*ok
-rm -f ./star-fusion.*txt
diff --git a/STAR-Fusion-0.1.1/test/runMe.sh b/STAR-Fusion-0.1.1/test/runMe.sh
deleted file mode 100755
index b4587df..0000000
--- a/STAR-Fusion-0.1.1/test/runMe.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-
-
-../STAR-Fusion -S Chimeric.out.sam.gz -J Chimeric.out.junction.gz
diff --git a/doc/STARmanual.pdf b/doc/STARmanual.pdf
index 08cdedc..c9238df 100644
Binary files a/doc/STARmanual.pdf and b/doc/STARmanual.pdf differ
diff --git a/extras/doc-latex/STARmanual.tex b/extras/doc-latex/STARmanual.tex
index ca3be10..ac2bec6 100644
--- a/extras/doc-latex/STARmanual.tex
+++ b/extras/doc-latex/STARmanual.tex
@@ -17,24 +17,24 @@
 
 %%%%%% global commands
 % option name, no reference
-\newcommand{\optn}[1]{\textcolor{violet}{\texttt{--#1}}}
+\newcommand{\optn}[1]{\sloppy\textcolor{violet}{\texttt{--#1}}}
 % option name
-\newcommand{\opt}[1]{\hyperlink{#1}{\optn{#1}}}
+\newcommand{\opt}[1]{\sloppy\hyperlink{#1}{\optn{#1}}}
 %option value, to be replaces with user value
-\newcommand{\optv}[1]{\texttt{#1}}
-\newcommand{\optvr}[1]{\textit{\texttt{#1}}}
+\newcommand{\optv}[1]{\sloppy\texttt{#1}}
+\newcommand{\optvr}[1]{\sloppy\textit{\texttt{#1}}}
 
-\newcommand{\code}[1]{\texttt{#1}}
+\newcommand{\code}[1]{\sloppy\texttt{#1}}
 	
 \newcommand{\codelines}[1]{\begin{adjustwidth}{0.5in}{0in}
 	\raggedright\texttt{#1}
 	\end{adjustwidth}}
 
-\newcommand{\ofilen}[1]{\texttt{#1}}
+\newcommand{\ofilen}[1]{\sloppy\texttt{#1}}
 
 \newcommand{\sechyperref}[1]{\hyperref[#1]{Section \ref{#1}. \nameref{#1}}}
 
-\title{STAR manual 2.4.2a}
+\title{STAR manual 2.5.0a}
 \author{Alexnder Dobin\\
 dobin at cshl.edu}
 \maketitle
@@ -173,9 +173,9 @@ The basic options to run a mapping job are as follows:
 \opt{readFilesIn} name(s) (with path) of the files containing the sequences to be mapped (e.g. RNA-seq FASTQ files). If using Illumina paired-end reads, the \optvr{read1} and \optv{read2} files have to be supplied. STAR can process both FASTA and FASTQ files. Multi-line (i.e. sequence split in multiple lines) FASTA file are supported. If the read files are compressed, use the \opt{readFilesCommand} \optvr{UncompressionCommand} option, where \optvr{UncompressionCommand} is the un-compress [...]
 \code{\opt{readFilesCommand} \optv{zcat}}
 OR
-\code{\opt{readFilesCommand} \optv{gzip -c}}.
+\code{\opt{readFilesCommand} \optv{gunzip -c}}.
 For bzip2-compressed files, use
-\code{\opt{readFilesCommand} \optv{bzip2 -c}}.
+\code{\opt{readFilesCommand} \optv{bunzip2 -c}}.
 \end{itemize}
 
 \subsection{Advanced options.}
@@ -231,11 +231,17 @@ STAR produces multiple output files. All files have standard name, however, you
 \subsection{SAM.}
 \ofilen{Aligned.out.sam} - alignments in standard SAM format.
 \subsubsection{Multimappers.}
-The number of loci Nmap a read maps to is given by \code{NH:i:}  field. Value of 1 corresponds to unique mappers, while values \textgreater1 corresponds to multi-mappers. \code{HI} attrbiutes enumerates multiple alignments of a read starting with 1.
+The number of loci Nmap a read maps to is given by \code{NH:i:}  field. Value of 1 corresponds to unique mappers, while values \textgreater1 corresponds to multi-mappers. \code{HI} attrbiutes enumerates multiple alignments of a read starting with 1 (this can be changed with the \opt{outSAMattrIHstart} - setting it to 0 may be required for compatibility with downstream software such as Cufflinks or StringTie).
 
 The mapping quality MAPQ (column 5) is 255 for uniquely mapping reads, and int(-10*log10(1-1/Nmap))  for multi-mapping reads. This scheme is same as the one used by TopHat and is compatible with Cufflinks. The default MAPQ=255 for the unique mappers maybe changed with \opt{outSAMmapqUnique} \optvr{Integer0to255} option to ensure compatibility with downstream tools such as GATK.
 
-For multi-mappers, all alignments except one are marked with 0x100 (secondary alignment) in the FLAG (column 2 of the SAM). The unmarked alignment is either the best one (i.e. highest scoring), or is randomly selected from the alignments of equal quality. This default behavior can be changed with \opt{outSAMprimaryFlag} \optv{AllBestScore} option, that will output all alignments with the best score as primary alignments (i.e. 0x100 bit in the FLAG unset).
+For multi-mappers, all alignments except one are marked with 0x100 (secondary alignment) in the FLAG (column 2 of the SAM). The unmarked alignment is selected from the best ones (i.e. highest scoring). This default behavior can be changed with \opt{outSAMprimaryFlag} \optv{AllBestScore} option, that will output all alignments with the best score as primary alignments (i.e. 0x100 bit in the FLAG unset).
+
+By default, the order of the multi-mapping alignments for each read is not truly random.
+The \opt{outMultimapperOrder} \optv{Random} option outputs multiple alignments for each read in random order, and also also randomizes the choice of the primary alignment from the highest scoring alignments. Parameter \opt{runRNGseed} can be used to set the random generator seed. With this option, the ordering of multi-mapping alignments of each read, and the choice of the primary alignment will vary from run to run, unless only one thread is used and the seed is kept constant.
+
+The \opt{outSAMmultNmax} parameter limits the number of output alignments (SAM lines) for multimappers. For instance, \opt{outSAMmultNmax} \optv{1} will output exactly one SAM line for each mapped read.
+
 
 \subsubsection{SAM attributes.}
 The SAM attributes can be specified by the user using \opt{outSAMattributes} \optvr{A1 A2 A3 ...} option which accept a list of 2-character SAM attrbiutes. The implemented attrbutes are: \optv{NH HI NM MD AS nM jM jI XS}. By default, STAR outputs \optv{NH HI AS nM} attributes.
@@ -277,7 +283,9 @@ output both unsorted and sorted files.
 \end{itemize}
 
 \subsection{Splice junctions.}
-\ofilen{SJ.out.tab} contains high confidence collapsed splice junctions in tab-delimited format. The columns have the following meaning:
+\ofilen{SJ.out.tab} contains high confidence collapsed splice junctions in tab-delimited format. 
+Note that STAR defines the junction start/end as intronic bases, while many other software define them as exonic bases.
+The columns have the following meaning:
 %\begin{enumerate}[label=\bfseries Exercise \arabic*:]
 \begin{itemize}[leftmargin=1in]
 \item[column 1:] chromosome
diff --git a/extras/doc-latex/parametersDefault.tex b/extras/doc-latex/parametersDefault.tex
index aa5a846..cc9d050 100644
--- a/extras/doc-latex/parametersDefault.tex
+++ b/extras/doc-latex/parametersDefault.tex
@@ -33,6 +33,9 @@
   \optOpt{User{\textunderscore}RWX}   \optOptLine{user-read/write/execute}
   \optOpt{All{\textunderscore}RWX}   \optOptLine{all-read/write/execute (same as chmod 777)}
 \end{optOptTable}
+\optName{runRNGseed}
+  \optValue{777}
+  \optLine{int: random number generator seed.} 
 \end{optTable}
 \optSection{Genome Parameters}\label{Genome_Parameters}
 \begin{optTable}
@@ -87,9 +90,9 @@
   \optLine{string: tag name to be used as exons' gene-parents (default "gene{\textunderscore}id" works for GTF files)} 
 \optName{sjdbOverhang}
   \optValue{100}
-  \optLine{int{\textgreater}=0: length of the donor/acceptor sequence on each side of the junctions, ideally = (mate{\textunderscore}length - 1)} 
-  \optLine{if =0, splice junction database is not used} 
-  \optLine{sjdbScore                               2} 
+  \optLine{int{\textgreater}0: length of the donor/acceptor sequence on each side of the junctions, ideally = (mate{\textunderscore}length - 1)} 
+\optName{sjdbScore}
+  \optValue{2}
   \optLine{int: extra alignment score for alignmets that cross database junctions} 
 \optName{sjdbInsertSave}
   \optValue{Basic}
@@ -121,6 +124,9 @@
 \optName{readMatesLengthsIn}
   \optValue{NotEqual}
   \optLine{string: Equal/NotEqual - lengths of names,sequences,qualities for both mates are the same  / not the same. NotEqual is safe in all situations.} 
+\optName{readNameSeparator}
+  \optValue{/}
+  \optLine{string(s): character(s) separating the part of the read names that will be trimmed in output (read name after space is always trimmed)} 
 \optName{clip3pNbases}
   \optValue{0}
   \optLine{int(s): number(s) of bases to clip from 3p of each mate. If one value is given, it will be assumed the same for both mates.} 
@@ -190,6 +196,13 @@
 \optName{outQSconversionAdd}
   \optValue{0}
   \optLine{int: add this number to the quality score (e.g. to convert from Illumina to Sanger, use -31)} 
+\optName{outMultimapperOrder}
+  \optValue{Old{\textunderscore}2.4}
+  \optLine{string: order of multimapping alignments in the output files} 
+\begin{optOptTable}
+  \optOpt{Old{\textunderscore}2.4}   \optOptLine{quasi-random order used before 2.5.0}
+  \optOpt{Random}   \optOptLine{random order of alignments for each multi-mapper. Read mates (pairs) are always adjacent, all alignment for each read stay together. This option will become default in the future releases.}
+\end{optOptTable}
 \end{optTable}
 \optSection{Output: SAM and BAM}\label{Output:_SAM_and_BAM}
 \begin{optTable}
@@ -231,6 +244,9 @@
   \optOpt{All}   \optOptLine{NH HI AS nM NM MD jM jI}
   \optOpt{None}   \optOptLine{no attributes}
 \end{optOptTable}
+\optName{outSAMattrIHstart}
+  \optValue{1}
+  \optLine{int{\textgreater}=0:                     start value for the IH attribute. 0 may be required by some downstream software, such as Cufflinks or StringTie.} 
 \optName{outSAMunmapped}
   \optValue{None}
   \optLine{string: output of unmapped reads in the SAM format} 
@@ -281,6 +297,18 @@
 \optName{outSAMheaderCommentFile}
   \optValue{-}
   \optLine{string: path to the file with @CO (comment) lines of the SAM header} 
+\optName{outSAMfilter}
+  \optValue{None}
+  \optLine{string(s): filter the output into main SAM/BAM files} 
+\begin{optOptTable}
+  \optOpt{KeepOnlyAddedReferences}   \optOptLine{only keep the reads for which all alignments are to the extra reference sequences added with --genomeFastaFiles at the mapping stage.}
+\end{optOptTable}
+\optName{outSAMmultNmax}
+  \optValue{-1}
+  \optLine{int: max number of multiple alignments for a read that will be output to the SAM/BAM files.} 
+\begin{optOptTable}
+  \optOpt{-1}   \optOptLine{all alignments (up to --outFilterMultimapNmax) will be output}
+\end{optOptTable}
 \optName{outBAMcompression}
   \optValue{1}
   \optLine{int: -1 to 10  BAM compression level, -1=default compression (6?), 0=no compression, 10=maximum compression} 
@@ -415,16 +443,16 @@
 \begin{optTable}
 \optName{scoreGap}
   \optValue{0}
-  \optLine{gap open penalty} 
+  \optLine{int: splice junction penalty (independent on intron motif)} 
 \optName{scoreGapNoncan}
   \optValue{-8}
-  \optLine{non-canonical gap open penalty (in addition to scoreGap)} 
+  \optLine{int: non-canonical junction penalty (in addition to scoreGap)} 
 \optName{scoreGapGCAG}
   \optValue{-4}
-  \optLine{GC/AG and CT/GC gap open penalty (in addition to scoreGap)} 
+  \optLine{GC/AG and CT/GC junction penalty (in addition to scoreGap)} 
 \optName{scoreGapATAC}
   \optValue{-8}
-  \optLine{AT/AC  and GT/AT gap open penalty  (in addition to scoreGap)} 
+  \optLine{AT/AC  and GT/AT junction penalty  (in addition to scoreGap)} 
 \optName{scoreGenomicLengthLog2scale}
   \optValue{-0.25}
   \optLine{extra score logarithmically scaled with genomic length of the alignment: scoreGenomicLengthLog2scale*log2(genomicLength)} 
@@ -479,6 +507,10 @@
 \optName{alignSJoverhangMin}
   \optValue{5}
   \optLine{int{\textgreater}0: minimum overhang (i.e. block size) for spliced alignments} 
+\optName{alignSJstitchMismatchNmax}
+  \optValue{0 -1 0 0}
+  \optLine{4*int{\textgreater}=0: maximum number of mismatches for stitching of the splice junctions (-1: no limit). } 
+  \optLine{(1) non-canonical motifs, (2) GT/AG and CT/AC motif, (3) GC/AG and CT/GC motif, (4) AT/AC and GT/AT motif.} 
 \optName{alignSJDBoverhangMin}
   \optValue{3}
   \optLine{int{\textgreater}0: minimum overhang (i.e. block size) for annotated (sjdb) spliced alignments} 
@@ -555,6 +587,16 @@
 \optName{chimJunctionOverhangMin}
   \optValue{20}
   \optLine{int{\textgreater}=0: minimum overhang for a chimeric junction} 
+\optName{chimSegmentReadGapMax}
+  \optValue{0}
+  \optLine{int{\textgreater}=0: maximum gap in the read sequence between chimeric segments} 
+\optName{chimFilter}
+  \optValue{banGenomicN}
+  \optLine{string(s): different filters for chimeric alignments} 
+\begin{optOptTable}
+  \optOpt{None}   \optOptLine{no filtering}
+  \optOpt{banGenomicN}   \optOptLine{Ns are not allowed in the genome sequence around the chimeric junction}
+\end{optOptTable}
 \end{optTable}
 \optSection{Quantification of Annotations}\label{Quantification_of_Annotations}
 \begin{optTable}
diff --git a/extras/doc-latex/texlive.profile b/extras/doc-latex/texlive.profile
new file mode 100644
index 0000000..ee1763e
--- /dev/null
+++ b/extras/doc-latex/texlive.profile
@@ -0,0 +1,33 @@
+# texlive.profile written on Fri Nov 15 17:32:28 2013 UTC
+# It will NOT be updated and reflects only the
+# installation profile at installation time.
+selected_scheme scheme-basic
+TEXDIR /usr/local/texlive
+TEXMFCONFIG ~/.texlive/texmf-config
+TEXMFHOME ~/texmf
+TEXMFLOCAL /usr/local/texlive/texmf-local
+TEXMFSYSCONFIG /usr/local/texlive/texmf-config
+TEXMFSYSVAR /usr/local/texlive/texmf-var
+TEXMFVAR ~/.texlive/texmf-var
+binary_x86_64-linux 1
+collection-basic 1
+in_place 0
+option_adjustrepo 1
+option_autobackup 1
+option_backupdir tlpkg/backups
+option_desktop_integration 1
+option_doc 1
+option_file_assocs 1
+option_fmt 1
+option_letter 0
+option_menu_integration 1
+option_path 0
+option_post_code 1
+option_src 1
+option_sys_bin /usr/local/bin
+option_sys_info /usr/local/share/info
+option_sys_man /usr/local/share/man
+option_w32_multi_user 0
+option_write18_restricted 1
+portable 0
+
diff --git a/extras/doc-latex/texlive_install.sh b/extras/doc-latex/texlive_install.sh
new file mode 100755
index 0000000..b893107
--- /dev/null
+++ b/extras/doc-latex/texlive_install.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+# By default, the main CTAN mirror is used to fetch packages from. If this
+# is distant from you, or you have a faster local mirror simply override
+# this by setting the CTAN_MIRROR_URL environmental variable outside this
+# script.
+# A list of mirrors can be found at http://ctan.org/mirrors
+
+# e.g. before running this script do:
+#   export CTAN_MIRROR_URL='http://mirror.aarnet.edu.au/pub/CTAN'
+
+wget \
+  --continue \
+  --directory-prefix /tmp \
+  ${CTAN_MIRROR_URL:-'http://mirror.ctan.org'}/systems/texlive/tlnet/install-tl-unx.tar.gz
+tar \
+  --extract \
+  --gunzip \
+  --directory /tmp \
+  --file /tmp/install-tl-unx.tar.gz
+
+# Install texlive using the supplied texlive.profile (this just installs a
+# basic LaTeX environment
+/tmp/install-tl-*/install-tl \
+  -repository ${CTAN_MIRROR_URL:-'http://mirror.ctan.org'}/systems/texlive/tlnet \
+  -no-gui \
+  -profile texlive.profile
+
+# Install packages required by the project
+packages=(
+  latex-bin
+  oberdiek
+  url
+  graphics
+  pdftex-def
+  colortbl
+  hyperref
+  xcolor
+  tools
+  hanging
+  changepage
+  geometry
+  enumitem
+  latexmk
+)
+tlmgr \
+  -repository ${CTAN_MIRROR_URL:-'http://mirror.ctan.org'}/systems/texlive/tlnet \
+  install \
+    ${packages[@]}
+
diff --git a/extras/scripts/sjFromSAMcollapseUandM_inclOverlaps.awk b/extras/scripts/sjFromSAMcollapseUandM_inclOverlaps.awk
new file mode 100644
index 0000000..cc731a4
--- /dev/null
+++ b/extras/scripts/sjFromSAMcollapseUandM_inclOverlaps.awk
@@ -0,0 +1,55 @@
+BEGIN {
+   OFS="\t";
+   mapqU=255;
+}
+{
+if (substr($1,1,1)!="@") {
+
+    m=and($2,0x80)/0x80+1;
+
+    if ($1!=readNameOld) delete readSJs;
+    readNameOld=$1;
+
+    n=split($6,L,/[A-Z]/)-1;
+    split($6,C,/[0-9]*/);
+    t=1;g=$4;
+    for (k=1;k<=n;k++) {#scan through CIGAR operations
+        if (C[k+1]=="S" || C[k+1]=="I") {
+           t+=L[k];
+        } else if (C[k+1]=="D") {
+           g+=L[k];
+        } else if (C[k+1]=="N") {
+           sj1=$3 "\t" g "\t" g+L[k]-1;
+           readSJs[sj1]++;
+
+           if (readSJs[sj1]==1) {#only count this junction if it has nto been counted for the same read
+               SJ[sj1]=1;
+               if ($5>=mapqU) {
+                   SJu[sj1]++;
+               } else {
+                   SJm[sj1]++;
+               };
+           };
+
+           if ($5>=mapqU) {
+               SJu1[sj1]++;
+           } else {
+               SJm1[sj1]++;
+           };
+
+           g+=L[k];
+
+        } else { # M operation
+           g+=L[k];
+           t+=L[k];
+        };
+    };
+};
+};
+END {
+
+for (ii in SJ) {
+    print ii, SJu[ii]+0, SJm[ii]+0, SJu1[ii]+0, SJm1[ii]+0;
+};
+
+};
diff --git a/source/Genome.cpp b/source/Genome.cpp
index 8f3fcc8..c50a688 100644
--- a/source/Genome.cpp
+++ b/source/Genome.cpp
@@ -5,6 +5,7 @@
 #include "ErrorWarning.h"
 #include "streamFuns.h"
 #include "SharedMemory.h"
+#include "genomeScanFastaFiles.h"
 
 #include <time.h>
 #include <cmath>
@@ -113,6 +114,9 @@ void Genome::genomeLoad(){//allocate and load Genome
         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_GENOME_FILES, *P);
     };
 
+    //find chr starts from files
+    P->chrInfoLoad();
+
     //check if sjdbInfo.txt exists => genome was generated with junctions
     bool sjdbInfoExists=false;
     struct stat sjdb1;
@@ -283,12 +287,20 @@ void Genome::genomeLoad(){//allocate and load Genome
     }
     else if (P->genomeLoad=="NoSharedMemory") // simply allocate memory, do not use shared memory
     {
+        P->genomeInsertL=0;
+        if (P->genomeFastaFiles.at(0)!="-")
+        {//will insert sequences in the genome, now estimate the extra size
+           uint oldlen=P->chrStart.back();//record the old length
+           P->genomeInsertChrIndFirst=P->nChrReal+1;
+           P->genomeInsertL=genomeScanFastaFiles(P,G,false)-oldlen; 
+        };
+        
         try {
             
             if (P->sjdbInsert.pass1 || P->sjdbInsert.pass2)
             {//reserve extra memory for insertion at the 1st and/or 2nd step
-                nGenomePass1=P->nGenome;
-                nSApass1=P->nSA;
+                nGenomePass1=P->nGenome+P->genomeInsertL;
+                nSApass1=P->nSA+2*P->genomeInsertL;
                 if (P->sjdbInsert.pass1)
                 {
                     nGenomePass1+=P->limitSjdbInsertNsj*P->sjdbLength;
@@ -312,10 +324,19 @@ void Genome::genomeLoad(){//allocate and load Genome
                 
                 SA.pointArray(SApass1.charArray+SApass1.lengthByte-SA.lengthByte);
             } else 
-            {//no insertions
-                G1=new char[P->nGenome+L+L];        
-                SA.allocateArray();
-                
+            {//no sjdb insertions
+                if (P->genomeInsertL==0)
+                {// no sequence insertion, simple allocation
+                    G1=new char[P->nGenome+L+L];        
+                    SA.allocateArray();
+                } else 
+                {
+                    G1=new char[P->nGenome+L+L+P->genomeInsertL];        
+                    SApass1.defineBits(P->GstrandBit+1,P->nSA+2*P->genomeInsertL);//TODO: re-define GstrandBit if necessary
+                    SApass1.allocateArray();
+                    SA.pointArray(SApass1.charArray+SApass1.lengthByte-SA.lengthByte);
+                };
+
             };            
             SAi.allocateArray();
             P->inOut->logMain <<"Shared memory is not used for genomes. Allocated a private copy of the genome.\n"<<flush;                
@@ -406,12 +427,10 @@ void Genome::genomeLoad(){//allocate and load Genome
 	uint shmSum=0;
 	for (uint ii=0;ii<shmSize;ii++) shmSum+=shmStart[ii];
         P->inOut->logMain << "genomeLoad=LoadAndExit: completed, the genome is loaded and kept in RAM, EXITING now.\n"<<flush;
-//         system("echo `date` ..... Finished genome loading >> Log.timing.out");
         return;
     };
     
-    //find chr starts from files
-    P->chrInfoLoad();
+    insertSequences();
 
     P->chrBinFill();
  
diff --git a/source/Genome.h b/source/Genome.h
index bbfe9f7..1136fd5 100644
--- a/source/Genome.h
+++ b/source/Genome.h
@@ -21,6 +21,9 @@ class Genome {
         void freeMemory();
         void genomeLoad();
 
+        void insertSequences();
+
+
     private:
     Parameters* P;
     key_t shmKey;  
@@ -29,5 +32,6 @@ class Genome {
     SharedMemory * sharedMemory;
     uint OpenStream(string name, ifstream & stream);
     void HandleSharedMemoryException(const SharedMemoryException & exc, uint64 shmSize);
+
 };
 #endif
diff --git a/source/Genome_insertSequences.cpp b/source/Genome_insertSequences.cpp
new file mode 100644
index 0000000..01de722
--- /dev/null
+++ b/source/Genome_insertSequences.cpp
@@ -0,0 +1,33 @@
+/* 
+ * inserts sequences into the SA and SAi indices
+ */
+#include "Genome.h"
+#include "genomeScanFastaFiles.h"
+#include "insertSeqSA.h"
+#include "TimeFunctions.h"
+
+void Genome::insertSequences()
+{
+if (P->genomeFastaFiles.at(0)!="-")
+{
+    time_t rawtime;
+    time ( &rawtime );
+    P->inOut->logMain  << timeMonthDayTime(rawtime) << " ..... Inserting extra sequences into genome indexes" <<endl;       
+    //move the junctions to free up space for seqs
+    // chrStart/Name/Length nChrReal include the extra sequences
+    // nGenome is the old, small genome size
+    uint sjdblen=P->nGenome-(P->chrStart.back()-P->genomeInsertL);//length of sjdb sequences
+    memmove(G+P->chrStart.back(),G+P->chrStart.back()-P->genomeInsertL,sjdblen);
+    memset(G+P->chrStart.back()-P->genomeInsertL, GENOME_spacingChar, P->genomeInsertL);//fill empty space with spacing characters
+        
+    genomeScanFastaFiles(P, G+P->chrStart.back()-P->genomeInsertL, true); //read the seqs from file(s) into the free space
+    uint64 nGenomeOld=P->nGenome;
+    P->nGenome=P->chrStart.back()+sjdblen; 
+    //insert new sequences into the SA
+    insertSeqSA(SA, SApass1, SAi, G, G+P->chrStart.back()-P->genomeInsertL, nGenomeOld-sjdblen, P->genomeInsertL, sjdblen, P);
+
+    //insert new sequences into the SAi
+    //update P
+    //save the genome if necessary
+};
+};
diff --git a/source/GlobalVariables.cpp b/source/GlobalVariables.cpp
index c912b3b..f0a14d0 100644
--- a/source/GlobalVariables.cpp
+++ b/source/GlobalVariables.cpp
@@ -1,5 +1,4 @@
-#ifndef CODE_GlobalVariables
-#define CODE_GlobalVariables
+#include "GlobalVariables.h"
 Stats g_statsAll;//global mapping statistics
 ThreadControl g_threadChunks;
-#endif
+
diff --git a/source/IncludeDefine.h b/source/IncludeDefine.h
index 5d4828e..6ce3e21 100644
--- a/source/IncludeDefine.h
+++ b/source/IncludeDefine.h
@@ -25,6 +25,8 @@
 
 #include "VERSION"
 
+#define ERROR_OUT string ( __FILE__ ) +":"+ to_string ( (uint) __LINE__ ) +":"+ string ( __FUNCTION__ )
+
 //external libs
 #define SAMTOOLS_BGZF_H "htslib/htslib/bgzf.h"
 #define SAMTOOLS_SAM_H  "htslib/htslib/sam.h"
@@ -48,6 +50,9 @@ typedef uint8_t uint8;
 #define int64 long long
 #define int32 int
 
+// this is gcc extension, may need to redefine for other compilers
+#define uint128 __uint128_t
+
 #define GENOME_spacingChar 5
 
 #define uintWinBin unsigned short
@@ -92,7 +97,7 @@ typedef uint8_t uint8;
 #define BAM_ATTR_MaxSize 1000
 
 #if defined COMPILE_FOR_LONG_READS
-    #define MAX_N_EXONS 200
+    #define MAX_N_EXONS 1000
 #else
     #define MAX_N_EXONS 20
 #endif     
@@ -101,7 +106,7 @@ typedef uint8_t uint8;
 #define MAX_N_MATES 2
 #define DEF_readNameLengthMax 50000
 #if defined COMPILE_FOR_LONG_READS
-    #define DEF_readSeqLengthMax 50000
+    #define DEF_readSeqLengthMax 500000
 #else
     #define DEF_readSeqLengthMax 500
 #endif
diff --git a/source/Makefile b/source/Makefile
index a52ecc0..eca66cd 100644
--- a/source/Makefile
+++ b/source/Makefile
@@ -1,3 +1,34 @@
+# user may define these whole flags
+# LDFLAGS
+# CPPFLAGS
+# CXXFLAGS
+# CFLAGS
+
+# or these user-set flags that will be added to standard flags
+LDFLAGSextra ?=
+CXXFLAGSextra ?=
+
+# user may define the compiler
+CXX ?= g++
+
+# pre-defined flags
+LDFLAGS_shared := -pthread -Lhtslib -Bstatic -lhts -Bdynamic -lz -lrt
+LDFLAGS_static := -static -static-libgcc -pthread -Lhtslib -lhts -lz
+LDFLAGS_Mac :=-pthread -lz htslib/libhts.a
+LDFLAGS_Mac_static :=-pthread -lz -static-libgcc htslib/libhts.a
+LDFLAGS_gdb := $(LDFLAGS_shared)
+
+COMPTIMEPLACE := -D'COMPILATION_TIME_PLACE="$(shell echo `date` $(HOSTNAME):`pwd`)"'
+
+CXXFLAGS_common := -pipe -std=c++11 -Wall -Wextra -fopenmp $(COMPTIMEPLACE)
+CXXFLAGS_main := -O3 $(CXXFLAGS_common)
+CXXFLAGS_gdb :=  -O0 -g $(CXXFLAGS_common)
+
+CFLAGS := -O3 -pipe -Wall -Wextra $(CFLAGS)
+
+
+##########################################################################################################
+
 OBJECTS = SharedMemory.o PackedArray.o SuffixArrayFuns.o STAR.o Parameters.o InOutStreams.o SequenceFuns.o Genome.o Stats.o \
         Transcript.o Transcript_alignScore.o \
         ReadAlign.o ReadAlign_storeAligns.o ReadAlign_stitchPieces.o ReadAlign_multMapSelect.o ReadAlign_mapOneRead.o readLoad.o \
@@ -9,38 +40,24 @@ OBJECTS = SharedMemory.o PackedArray.o SuffixArrayFuns.o STAR.o Parameters.o InO
         ReadAlign_createExtendWindowsWithAlign.o ReadAlign_assignAlignToWindow.o ReadAlign_oneRead.o \
 	ReadAlign_stitchWindowSeeds.o ReadAlign_chimericDetection.o \
         stitchWindowAligns.o extendAlign.o stitchAlignToTranscript.o alignSmithWaterman.o \
-        genomeGenerate.o genomeParametersWrite.o \
+        genomeGenerate.o genomeParametersWrite.o genomeScanFastaFiles.o genomeSAindex.o \
+        Genome_insertSequences.o insertSeqSA.o funCompareUintAndSuffixes.o \
 	TimeFunctions.o ErrorWarning.o loadGTF.o streamFuns.o stringSubstituteAll.o \
         Transcriptome.o Transcriptome_quantAlign.o ReadAlign_quantTranscriptome.o Quantifications.o Transcriptome_geneCountsAddAlign.o \
         sjdbLoadFromFiles.o sjdbLoadFromStream.o sjdbPrepare.o sjdbBuildIndex.o sjdbInsertJunctions.o mapThreadsSpawn.o \
         Parameters_openReadsFiles.cpp Parameters_closeReadsFiles.cpp \
         BAMoutput.o BAMfunctions.o ReadAlign_alignBAM.o BAMbinSortByCoordinate.o signalFromBAM.o bamRemoveDuplicates.o BAMbinSortUnmapped.o \
-        bam_cat.o
-SOURCES := $(wildcard *.cpp) $(wildcard *.c)
+        bam_cat.o \
+        GlobalVariables.cpp
 
-LDFLAGS := -pthread -Lhtslib -Bstatic -lhts -Bdynamic -lz -lrt
-LDFLAGS_static := -static -static-libgcc -pthread -Lhtslib -lhts -lz
-LDFLAGS_Mac :=-pthread -lz htslib/libhts.a
-LDFLAGS_Mac_static :=-pthread -lz -static-libgcc htslib/libhts.a
-
-LDFLAGS_gdb := $(LDFLAGS_static)
-LDFLAGS_gdb := $(LDFLAGS)
-
-COMPTIMEPLACE := -D'COMPILATION_TIME_PLACE="$(shell echo `date` $(HOSTNAME):`pwd`)"'
-EXTRAFLAGS := 
-
-CCFLAGS_common := -pipe -std=c++0x -Wall -Wextra -fopenmp $(COMPTIMEPLACE) $(OPTIMFLAGS) $(OPTIMFLAGS1) $(EXTRAFLAGS)
-CCFLAGS_main := -O3 $(CCFLAGS_common)
-CCFLAGS_gdb :=  -O0 -g $(CCFLAGS_common)
-
-CXX ?=g++
+SOURCES := $(wildcard *.cpp) $(wildcard *.c)
 
 
 %.o : %.cpp
-	$(CXX) -c $(CCFLAGS) $<
+	$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $<
 
 %.o : %.c
-	$(CXX) -c $(CCFLAGS) $<
+	$(CXX) -c $(CPPFLAGS) $(CFLAGS) $<
 
 all: STAR
 
@@ -67,7 +84,7 @@ ifneq ($(MAKECMDGOALS),STARforMacGDB)
 Depend.list: $(SOURCES) parametersDefault.xxd htslib
 	echo $(SOURCES)
 	/bin/rm -f ./Depend.list
-	$(CXX) $(CCFLAGS_common) -MM $^ >> Depend.list
+	$(CXX) $(CXXFLAGS_common) -MM $^ >> Depend.list
 include Depend.list
 endif
 endif
@@ -83,54 +100,49 @@ htslib/libhts.a :
 parametersDefault.xxd: parametersDefault
 	xxd -i parametersDefault > parametersDefault.xxd
 
-STAR : CCFLAGS=$(CCFLAGS_main)
+STAR : CXXFLAGS := $(CXXFLAGSextra) $(CXXFLAGS_main) $(CXXFLAGS)
+STAR : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_shared) $(LDFLAGS)
 STAR : Depend.list parametersDefault.xxd $(OBJECTS)
-	$(CXX) -o STAR $(CCFLAGS) $(OBJECTS) $(LDFLAGS)
+	$(CXX) -o STAR $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
 
-POSIXSHARED : CCFLAGS=$(CCFLAGS_main) -DPOSIX_SHARED_MEM
+POSIXSHARED : CXXFLAGS := $(CXXFLAGSextra) $(CXXFLAGS_main) -DPOSIX_SHARED_MEM $(CXXFLAGS)
+POSIXSHARED : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_shared) $(LDFLAGS)
 POSIXSHARED : Depend.list parametersDefault.xxd $(OBJECTS)
-	$(CXX) -o STAR $(CCFLAGS) $(OBJECTS) $(LDFLAGS)
+	$(CXX) -o STAR $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
 
-STARstatic : CCFLAGS=$(CCFLAGS_main)
+STARstatic : CXXFLAGS := $(CXXFLAGSextra) $(CXXFLAGS_main) $(CXXFLAGS)
+STARstatic : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_static) $(LDFLAGS)
 STARstatic : Depend.list parametersDefault.xxd $(OBJECTS)
-	$(CXX) -o STAR $(OBJECTS) $(CCFLAGS) $(LDFLAGS_static)
+	$(CXX) -o STAR $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
 
-STARlong : CCFLAGS=-D'COMPILE_FOR_LONG_READS' $(CCFLAGS_main)
+STARlong : CXXFLAGS := $(CXXFLAGSextra) $(CXXFLAGS_main) -D'COMPILE_FOR_LONG_READS' $(CXXFLAGS)
+STARlong : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_shared) $(LDFLAGS)
 STARlong : Depend.list parametersDefault.xxd $(OBJECTS)
-	$(CXX) -o STARlong $(CCFLAGS) $(OBJECTS) $(LDFLAGS)
+	$(CXX) -o STARlong $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
 
-STARlongStatic : CCFLAGS=-D'COMPILE_FOR_LONG_READS' $(CCFLAGS_main)
+STARlongStatic : CXXFLAGS := $(CXXFLAGSextra) $(CXXFLAGS_main) -D'COMPILE_FOR_LONG_READS' $(CXXFLAGS)
+STARlongStatic : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_static) $(LDFLAGS)
 STARlongStatic : Depend.list parametersDefault.xxd $(OBJECTS)
-	$(CXX) -o STARlong $(OBJECTS) $(CCFLAGS) $(LDFLAGS_static)
-
-#not recommended!
-STARforMac : CCFLAGS=-D'COMPILE_FOR_MAC' -I ./Mac_Include/ $(CCFLAGS_main)
-STARforMac : parametersDefault.xxd $(OBJECTS)
-	$(CXX) -o STAR $(CCFLAGS) $(LDFLAGS_Mac) $(OBJECTS)
-
-STARforMacStatic : CCFLAGS=-D'COMPILE_FOR_MAC' -I ./Mac_Include/ $(CCFLAGS_main)
-STARforMacStatic : parametersDefault.xxd $(OBJECTS)
-	$(CXX) -o STAR $(CCFLAGS) $(LDFLAGS_Mac_static) $(OBJECTS)
+	$(CXX) -o STARlong $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
 
-STARlongForMacStatic : CCFLAGS=-D'COMPILE_FOR_LONG_READS' -D'COMPILE_FOR_MAC' -I ./Mac_Include/ $(CCFLAGS_main)
-STARlongForMacStatic : parametersDefault.xxd $(OBJECTS)
-	$(CXX) -o STARlong $(CCFLAGS) $(LDFLAGS_Mac_static) $(OBJECTS)
-
-#
-STARforMacGDB : CCFLAGS=-D'COMPILE_FOR_MAC' -I ./Mac_Include/ $(CCFLAGS_gdb)
-STARforMacGDB : parametersDefault.xxd $(OBJECTS)
-	$(CXX) -o STAR $(CCFLAGS_gdb) $(OBJECTS) $(LDFLAGS_gdb)
-
-gdb : CCFLAGS= $(CCFLAGS_gdb)
+gdb : CXXFLAGS := $(CXXFLAGSextra) $(CXXFLAGS_gdb) $(CXXFLAGS)
+gdb : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_gdb) $(LDFLAGS)
 gdb : Depend.list parametersDefault.xxd $(OBJECTS)
-	$(CXX) -o STAR $(CCFLAGS_gdb) $(OBJECTS) $(LDFLAGS_gdb) 
+	$(CXX) -o STAR $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
 
-gdb-long : CCFLAGS= -D'COMPILE_FOR_LONG_READS' $(CCFLAGS_gdb)
+gdb-long : CXXFLAGS := $(CXXFLAGSextra) $(CXXFLAGS_gdb) -D'COMPILE_FOR_LONG_READS' $(CXXFLAGS)
+gdb-long : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_gdb) $(LDFLAGS)
 gdb-long : Depend.list parametersDefault.xxd $(OBJECTS)
-	$(CXX) -o STARlong $(CCFLAGS_gdb) $(OBJECTS) $(LDFLAGS_gdb) 
+	$(CXX) -o STARlong $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
+
+STARforMacStatic : CXXFLAGS := $(CXXFLAGSextra) $(CXXFLAGS_main) -D'COMPILE_FOR_MAC' $(CXXFLAGS)
+STARforMacStatic : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_Mac_static) $(LDFLAGS)
+STARforMacStatic : Depend.list parametersDefault.xxd $(OBJECTS)
+	$(CXX) -o STAR $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
 
-localChains : CCFLAGS=-D'OUTPUT_localChains' $(CCFLAGS_main)
-localChains : Depend.list parametersDefault.xxd $(OBJECTS)
-	$(CXX) -o STAR $(CCFLAGS) $(LDFLAGS) $(OBJECTS)
+STARlongForMacStatic : CXXFLAGS := -D'COMPILE_FOR_LONG_READS' $(CXXFLAGSextra) $(CXXFLAGS_main) -D'COMPILE_FOR_MAC' $(CXXFLAGS)
+STARlongForMacStatic : LDFLAGS := $(LDFLAGSextra) $(LDFLAGS_Mac_static) $(LDFLAGS)
+STARlongForMacStatic : Depend.list parametersDefault.xxd $(OBJECTS)
+	$(CXX) -o STARlong $(CXXFLAGS) $(OBJECTS) $(LDFLAGS)
 
 
diff --git a/source/Parameters.cpp b/source/Parameters.cpp
index 4840a3f..25a7ae7 100644
--- a/source/Parameters.cpp
+++ b/source/Parameters.cpp
@@ -33,6 +33,7 @@ Parameters::Parameters() {//initalize parameters info
     parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "runMode", &runMode));
     parArray.push_back(new ParameterInfoScalar <int> (-1, -1, "runThreadN", &runThreadN));        
     parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "runDirPerm", &runDirPermIn));
+    parArray.push_back(new ParameterInfoScalar <int> (-1, -1, "runRNGseed", &runRNGseed));        
     
     //genome
     parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "genomeDir", &genomeDir));
@@ -46,7 +47,9 @@ Parameters::Parameters() {//initalize parameters info
     parArray.push_back(new ParameterInfoVector <string> (-1, -1, "readFilesIn", &readFilesIn));
     parArray.push_back(new ParameterInfoVector <string> (-1, -1, "readFilesCommand", &readFilesCommand));
     parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "readMatesLengthsIn", &readMatesLengthsIn));
-    parArray.push_back(new ParameterInfoScalar <uint> (-1, -1, "readMapNumber", &readMapNumber));        
+    parArray.push_back(new ParameterInfoScalar <uint> (-1, -1, "readMapNumber", &readMapNumber));     
+    parArray.push_back(new ParameterInfoVector <string> (-1, -1, "readNameSeparator", &readNameSeparator));
+
     
     //input from BAM
     parArray.push_back(new ParameterInfoScalar <string> (-1, -1, "inputBAMfile", &inputBAMfile));
@@ -71,6 +74,7 @@ Parameters::Parameters() {//initalize parameters info
     parArray.push_back(new ParameterInfoScalar <string>     (-1, 2, "outStd", &outStd));        
     parArray.push_back(new ParameterInfoScalar <string>     (-1, -1, "outReadsUnmapped", &outReadsUnmapped));
     parArray.push_back(new ParameterInfoScalar <int>        (-1, -1, "outQSconversionAdd", &outQSconversionAdd));
+    parArray.push_back(new ParameterInfoScalar <string>     (-1, -1, "outMultimapperOrder", &outMultimapperOrder.mode));
     
     //outSAM
     parArray.push_back(new ParameterInfoVector <string>     (-1, -1, "outSAMtype", &outSAMtype));    
@@ -90,6 +94,9 @@ Parameters::Parameters() {//initalize parameters info
     parArray.push_back(new ParameterInfoScalar <string>     (-1, -1, "outSAMheaderCommentFile", &outSAMheaderCommentFile));
     parArray.push_back(new ParameterInfoScalar <int>        (-1, -1, "outBAMcompression", &outBAMcompression));
     parArray.push_back(new ParameterInfoScalar <int>        (-1, -1, "outBAMsortingThreadN", &outBAMsortingThreadN));
+    parArray.push_back(new ParameterInfoVector <string>     (-1, -1, "outSAMfilter", &outSAMfilter.mode));
+    parArray.push_back(new ParameterInfoScalar <uint>     (-1, -1, "outSAMmultNmax", &outSAMmultNmax));
+    parArray.push_back(new ParameterInfoScalar <uint>     (-1, -1, "outSAMattrIHstart", &outSAMattrIHstart));
 
 
    //output SJ filtering
@@ -166,12 +173,13 @@ Parameters::Parameters() {//initalize parameters info
     parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignTranscriptsPerReadNmax", &alignTranscriptsPerReadNmax));    
     parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignSJoverhangMin", &alignSJoverhangMin));    
     parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignSJDBoverhangMin", &alignSJDBoverhangMin));    
-
+    parArray.push_back(new ParameterInfoVector <int32>      (-1, -1, "alignSJstitchMismatchNmax", &alignSJstitchMismatchNmax));
+    
     parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignSplicedMateMapLmin", &alignSplicedMateMapLmin));       
     parArray.push_back(new ParameterInfoScalar <double>     (-1, -1, "alignSplicedMateMapLminOverLmate", &alignSplicedMateMapLminOverLmate));       
     parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignWindowsPerReadNmax", &alignWindowsPerReadNmax));  
     parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "alignTranscriptsPerWindowNmax", &alignTranscriptsPerWindowNmax));  
-    parArray.push_back(new ParameterInfoScalar <string>     (-1, -1, "alignEndsType", &alignEndsType));  
+    parArray.push_back(new ParameterInfoScalar <string>     (-1, -1, "alignEndsType", &alignEndsType.in));  
     parArray.push_back(new ParameterInfoScalar <string>     (-1, -1, "alignSoftClipAtReferenceEnds", &alignSoftClipAtReferenceEnds));  
 
 
@@ -183,6 +191,8 @@ Parameters::Parameters() {//initalize parameters info
     parArray.push_back(new ParameterInfoScalar <int>        (-1, -1, "chimScoreJunctionNonGTAG", &chimScoreJunctionNonGTAG));    
     parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "chimJunctionOverhangMin", &chimJunctionOverhangMin));    
     parArray.push_back(new ParameterInfoScalar <string>     (-1, -1, "chimOutType", &chimOutType));
+    parArray.push_back(new ParameterInfoVector <string>     (-1, -1, "chimFilter", &chimFilter));
+    parArray.push_back(new ParameterInfoScalar <uint>       (-1, -1, "chimSegmentReadGapMax", &chimSegmentReadGapMax));
     
     //sjdb
     parArray.push_back(new ParameterInfoVector <string> (-1, -1, "sjdbFileChrStartEnd", &sjdbFileChrStartEnd));
@@ -251,7 +261,16 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
                 exit(0);
             };
             
-            if (oneArg.substr(0,2)=="--") {//parameter name, cut -- 
+            size_t found = oneArg.find("=");
+            if (found!=string::npos && oneArg.substr(0,2)=="--") {// --parameter=value
+                string key = oneArg.substr(2, found - 2);
+                string val = oneArg.substr(found + 1);
+                if (val.find_first_of(" \t")!=std::string::npos) {//there is white space in the argument, put "" around
+                    val ='\"' + val + '\"';
+                };                
+                commandLineFile += '\n' + key + ' ' + val;
+            }
+            else if (oneArg.substr(0,2)=="--") {//parameter name, cut -- 
                 commandLineFile +='\n' + oneArg.substr(2);
             } else {//parameter value
                 if (oneArg.find_first_of(" \t")!=std::string::npos) {//there is white space in the argument, put "" around
@@ -368,8 +387,7 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
     
     ///////////////////////////////////////// Old variables
     outputBED[0]=0; outputBED[1]=0; //controls the format of starBED output. Will be replaced with HDF5 output
-    //chimeric
-    maxChimReadGap=0;
+
     //annot scoring
     annotScoreScale=0;
     annotSignalFile="-";
@@ -600,6 +618,10 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
     for (int ii=0;ii<4;ii++) {
         if (outSJfilterOverhangMin.at(ii)<0) outSJfilterOverhangMin.at(ii)=numeric_limits<int32>::max();
         if (outSJfilterCountUniqueMin.at(ii)<0) outSJfilterCountUniqueMin.at(ii)=numeric_limits<int32>::max();
+        if (outSJfilterCountTotalMin.at(ii)<0) outSJfilterCountTotalMin.at(ii)=numeric_limits<int32>::max();
+        if (outSJfilterDistToOtherSJmin.at(ii)<0) outSJfilterDistToOtherSJmin.at(ii)=numeric_limits<int32>::max();
+        
+        if (alignSJstitchMismatchNmax.at(ii)<0) alignSJstitchMismatchNmax.at(ii)=numeric_limits<int32>::max();
     };
     
     if (limitGenomeGenerateRAM==0) {//must be >0
@@ -632,6 +654,35 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
         };    
     };
     
+    outSAMfilter.yes=false;    
+    outSAMfilter.KeepOnlyAddedReferences=false;
+    if (outSAMfilter.mode.at(0)=="KeepOnlyAddedReferences")
+    {
+        outSAMfilter.yes=true;
+        outSAMfilter.KeepOnlyAddedReferences=true;
+    } else if (outSAMfilter.mode.at(0)!="None")
+    {
+        ostringstream errOut;
+        errOut <<"EXITING because of FATAL INPUT ERROR: unknown/unimplemented value for --outSAMfilter: "<<outSAMfilter.mode.at(0) <<"\n";
+        errOut <<"SOLUTION: specify one of the allowed values: KeepOnlyAddedReferences or None\n";
+        exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                
+    };
+        
+    if (outMultimapperOrder.mode=="Old_2.4")
+    {
+        outMultimapperOrder.random=false;      
+    } else if (outMultimapperOrder.mode=="Random")
+    {
+        outMultimapperOrder.random=true;
+    } else
+    {
+        ostringstream errOut;
+        errOut <<"EXITING because of FATAL INPUT ERROR: unknown/unimplemented value for --outMultimapperOrder: "<<outMultimapperOrder.mode <<"\n";
+        errOut <<"SOLUTION: specify one of the allowed values: Old_2.4 or SortedByCoordinate or Random\n";
+        exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);                
+    };
+        
+    
     readNmates=readFilesIn.size(); //for now the number of mates is defined by the number of input files
     
     if (runMode=="alignReads" && genomeLoad!="Remove" && genomeLoad!="LoadAndExit") {//open reads files to check if they are present
@@ -812,16 +863,31 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
        inOut->logMain << "WARNING --chimOutType=WithinBAM, therefore STAR will output NM attribute" <<endl;
     };
 
-    
-    outFilterMismatchNoverLmax1=outFilterMismatchNoverLmax;
-    if (alignEndsType=="EndToEnd") {
-        outFilterMismatchNoverLmax1=-1;
-    } else if (alignEndsType=="Local" || alignEndsType=="Extend5pOfRead1" ) {
+    alignEndsType.ext[0][0]=false;
+    alignEndsType.ext[0][1]=false;
+    alignEndsType.ext[1][0]=false;
+    alignEndsType.ext[1][1]=false;
+
+    if (alignEndsType.in=="EndToEnd") 
+    {
+        alignEndsType.ext[0][0]=true;
+        alignEndsType.ext[0][1]=true;
+        alignEndsType.ext[1][0]=true;
+        alignEndsType.ext[1][1]=true;
+    } else if (alignEndsType.in=="Extend5pOfRead1" ) 
+    {
+        alignEndsType.ext[0][0]=true;
+    } else if (alignEndsType.in=="Extend3pOfRead1" )
+    {
+        alignEndsType.ext[0][1]=true;
+    } else if (alignEndsType.in=="Local")
+    {
         //nothing to do for now
-    } else {
+    } else 
+    {
         ostringstream errOut;
-        errOut <<"EXITING because of FATAL INPUT ERROR: unknown/unimplemented value for --alignEndsType: "<<alignEndsType <<"\n";
-        errOut <<"SOLUTION: re-run STAR with --alignEndsType Local or EndToEnd\n";
+        errOut <<"EXITING because of FATAL INPUT ERROR: unknown/unimplemented value for --alignEndsType: "<<alignEndsType.in <<"\n";
+        errOut <<"SOLUTION: re-run STAR with --alignEndsType Local OR EndToEnd OR Extend5pOfRead1 OR Extend3pOfRead1\n";
         exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
         
@@ -893,17 +959,27 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
     {
         ostringstream errOut;
         errOut << "EXITING because of fatal PARAMETERS error: --twopass1readsN is defined, but --twoPassMode is not defined\n";
-        errOut << "SOLUTION: to activate the 2-pass mode, use --twoPassMode Basic";
+        errOut << "SOLUTION: to activate the 2-pass mode, use --twopassMode Basic";
         exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
     
+    
+    
     twoPass.yes=false;
     if (twoPass.mode!="None") {//2-pass parameters
+        if (runMode!="alignReads")
+        {
+            ostringstream errOut;
+            errOut << "EXITING because of fatal PARAMETERS error: 2-pass mapping option  can only be used with --runMode alignReads\n";
+            errOut << "SOLUTION: remove --twopassMode option";
+            exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
+        };
+        
         if (twoPass.mode!="Basic")
         {
             ostringstream errOut;
             errOut << "EXITING because of fatal PARAMETERS error: unrecognized value of --twopassMode="<<twoPass.mode<<"\n";
-            errOut << "SOLUTION: for the 2-pass mode, use allowes values --twopassMode: Basic";
+            errOut << "SOLUTION: for the 2-pass mode, use allowed values --twopassMode: Basic";
             exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         };
         
@@ -936,6 +1012,7 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
 
     sjdbInsert.pass1=false;
     sjdbInsert.pass2=false;
+    sjdbInsert.yes=false;
     if (sjdbFileChrStartEnd.at(0)!="-" || sjdbGTFfile!="-")
     {//will insert annotated sjdb on the fly
        sjdbInsert.pass1=true;
@@ -983,7 +1060,7 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             errOut <<"SOLUTION: please use default --genomeLoad NoSharedMemory, \n        OR specify --limitBAMsortRAM the amount of RAM (bytes) that can be allocated for BAM sorting in addition to shared memory allocated for the genome.\n        --limitBAMsortRAM typically has to be > 10000000000 (i.e 10GB).\n";
             exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
         };
-        inOut->logMain<<"WARNING: --limitBAMsortRAM=0, will use genome sizeas RAM linit foro BAM sorting\n";
+        inOut->logMain<<"WARNING: --limitBAMsortRAM=0, will use genome size as RAM limit for BAM sorting\n";
     };
 
     if (chimOutType=="WithinBAM" && !outBAMunsorted && !outBAMcoord) {
@@ -993,6 +1070,53 @@ void Parameters::inputParameters (int argInN, char* argIn[]) {//input parameters
             exitWithError(errOut.str(), std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
     };
     
+    //chimeric
+    chimPar.filter.genomicN=false;
+    for (int ii=0; ii<chimFilter.size(); ii++)
+    {
+        if (chimFilter.at(ii)=="banGenomicN")
+        {
+            chimPar.filter.genomicN=true;
+        } 
+        else if (chimFilter.at(ii)=="None")
+        {//nothing to do
+        }
+        else 
+        {
+            ostringstream errOut;
+            errOut << "EXITING because of fatal PARAMETERS error: unrecognized value of --chimFilter="<<chimFilter.at(ii)<<"\n";
+            errOut << "SOLUTION: use allowed values: banGenomicN || None";
+            exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
+        };
+    };
+    
+    for (int ii=0; ii<readNameSeparator.size(); ii++)
+    {
+        if (readNameSeparator.at(ii)=="space")
+        {
+            readNameSeparatorChar.push_back(' ');
+        } 
+        else if (readNameSeparator.at(ii)=="none")
+        {
+            //nothing to do
+        }
+        else if (readNameSeparator.at(ii).size()==1)
+        {
+            readNameSeparatorChar.push_back(readNameSeparator.at(ii).at(0));
+        }
+        else 
+        {
+            ostringstream errOut;
+            errOut << "EXITING because of fatal PARAMETERS error: unrecognized value of --readNameSeparator="<<readNameSeparator.at(ii)<<"\n";
+            errOut << "SOLUTION: use allowed values: space OR single characters";
+            exitWithError(errOut.str(),std::cerr, inOut->logMain, EXIT_CODE_PARAMETER, *this);
+        };    
+    };
+
+
+    //genome parameters
+    genomeChrBinNbases=1LLU<<genomeChrBinNbits;
+    
     inOut->logMain << "Finished loading and checking parameters\n" <<flush;
 };
 
@@ -1136,7 +1260,6 @@ void Parameters::chrInfoLoad() {//find chrStart,Length,nChr from Genome G
 
 //////////////////////////////////////////////////////////
 void Parameters::chrBinFill() {
-    genomeChrBinNbases=1LLU<<genomeChrBinNbits;
     chrBinN = chrStart[nChrReal]/genomeChrBinNbases+1;    
     chrBin = new uint [chrBinN];
     for (uint ii=0, ichr=1; ii<chrBinN; ++ii) {
diff --git a/source/Parameters.h b/source/Parameters.h
index 9005e83..479b740 100644
--- a/source/Parameters.h
+++ b/source/Parameters.h
@@ -29,6 +29,7 @@ class Parameters {
         int runThreadN;
         mode_t runDirPerm;
         string runDirPermIn; //permission for directores created at run-time
+        int runRNGseed; //random number generator seed
     
         //parameters
         vector <string> parametersFiles;
@@ -41,6 +42,9 @@ class Parameters {
         string genomeDir,genomeLoad;
         vector <string> genomeFastaFiles; 
         uint genomeSAsparseD;//sparsity=distance between indices
+        uint genomeInsertL; //total length of the sequence to be inserted on the fly
+        uint genomeInsertChrIndFirst; //index of the first inserted chromosome
+        
         //binning,windows,anchors
         uint genomeChrBinNbits, genomeChrBinNbases, chrBinN, *chrBin;
         uint winBinChrNbits, winBinNbits, winAnchorDistNbins, winFlankNbins, winBinN;
@@ -62,6 +66,9 @@ class Parameters {
         vector <string> readFilesCommand;
         pid_t readFilesCommandPID[MAX_N_MATES];
         
+        vector <string> readNameSeparator;
+        vector <char> readNameSeparatorChar;
+        
         string outSAMreadID;
         
         vector <uint> clip5pNbases, clip3pNbases, clip3pAfterAdapterNbases;    
@@ -79,7 +86,15 @@ class Parameters {
         uint alignIntronMin;//min length to call a gap an intron
         uint alignIntronMax;//max length to call 
         uint alignMatesGapMax;//max gap between the mates (if paired-end)
-        string alignEndsType, alignSoftClipAtReferenceEnds;
+        string alignSoftClipAtReferenceEnds;
+        vector <int32> alignSJstitchMismatchNmax;
+        
+        struct 
+        {
+            string in;
+            bool ext[2][2];
+        } alignEndsType;
+        
         
         //seed parameters
         uint seedMultimapNmax; //max number of multiple alignments per piece          
@@ -102,6 +117,7 @@ class Parameters {
         string outSAMmode, outSAMstrandField,  outSAMunmapped, outSAMorder, outSAMprimaryFlag;
         vector<string> outSAMattributes, outSAMheaderHD, outSAMheaderPG;
         vector<string> outSAMattrRGline,outSAMattrRGlineSplit,outSAMattrRG;
+        uint outSAMmultNmax,outSAMattrIHstart;
         string outSAMheaderCommentFile;
         int outSAMmapqUnique;
         struct {bool NH,HI,AS,NM,MD,nM,jM,jI,RG,XS;} outSAMattrPresent, outSAMattrPresentQuant;
@@ -117,13 +133,26 @@ class Parameters {
         uint64 *outBAMsortingBinStart; //genomic starts for bins for sorting BAM files
         uint16 outSAMflagOR, outSAMflagAND;
         
+        struct
+        {
+            vector <string> mode;
+            bool yes;
+            bool KeepOnlyAddedReferences;
+        } outSAMfilter;
+        
+        struct
+        {
+            string mode;
+            bool random;
+        } outMultimapperOrder;
+        
         string outReadsUnmapped;
         int outQSconversionAdd;
         string outFileTmp;
         
         //output filtering
         uint outFilterMismatchNmax;
-        double outFilterMismatchNoverLmax, outFilterMismatchNoverReadLmax, outFilterMismatchNoverLmax1; //max proportion of all MM within all bases
+        double outFilterMismatchNoverLmax, outFilterMismatchNoverReadLmax; //max proportion of all MM within all bases
         
         uint outFilterMatchNmin,outFilterMultimapNmax;//min number of matches
         double outFilterScoreMinOverLread, outFilterMatchNminOverLread;//normalzied to read length
@@ -241,9 +270,18 @@ class Parameters {
         
         //chimeric
         uint chimSegmentMin, chimJunctionOverhangMin; //min chimeric donor/acceptor length
-        uint maxChimReadGap; //max read gap for stitching chimeric windows
+        uint chimSegmentReadGapMax; //max read gap for stitching chimeric windows
         int chimScoreMin,chimScoreDropMax,chimScoreSeparation, chimScoreJunctionNonGTAG; //min chimeric score
         string chimOutType;
+        vector <string> chimFilter;
+        
+        struct 
+        {
+            struct
+            {
+                bool genomicN;
+            } filter;
+        } chimPar;
         
         //splitting
         char Qsplit;
diff --git a/source/ReadAlign.cpp b/source/ReadAlign.cpp
index 76018b6..a46e198 100644
--- a/source/ReadAlign.cpp
+++ b/source/ReadAlign.cpp
@@ -3,7 +3,7 @@
 #include "Transcript.h"
 #include "ReadAlign.h"
 
-ReadAlign::ReadAlign (Parameters* Pin, const Genome &genomeIn, Transcriptome *TrIn) : P(Pin), chunkTr(TrIn) {//allocate arrays
+ReadAlign::ReadAlign (Parameters* Pin, const Genome &genomeIn, Transcriptome *TrIn, int iChunk) : P(Pin), chunkTr(TrIn) {//allocate arrays
 
     G=genomeIn.G;
     SA=genomeIn.SA;
@@ -16,6 +16,10 @@ ReadAlign::ReadAlign (Parameters* Pin, const Genome &genomeIn, Transcriptome *Tr
     memset(winBin[0],255,sizeof(winBin[0][0])*P->winBinN);
     memset(winBin[1],255,sizeof(winBin[0][0])*P->winBinN);
     
+    //RNGs
+    rngMultOrder.seed(P->runRNGseed*(iChunk+1));
+    rngUniformReal0to1=std::uniform_real_distribution<double> (0.0, 1.0);    
+    
     //transcriptome
     if ( P->quant.trSAM.yes ) {
         alignTrAll=new Transcript [P->alignTranscriptsPerReadNmax];
diff --git a/source/ReadAlign.h b/source/ReadAlign.h
index 5fec1c1..aed1d97 100644
--- a/source/ReadAlign.h
+++ b/source/ReadAlign.h
@@ -11,8 +11,10 @@
 #include "Transcriptome.h"
 #include "BAMoutput.h"
 #include "Quantifications.h"
+#include <random>
 
-class ReadAlign : public Genome {
+class ReadAlign : public Genome 
+{
     public:
         Parameters* P; //pointer to the parameters, will be initialized on construction
           
@@ -25,6 +27,9 @@ class ReadAlign : public Genome {
         //mapping time
         time_t timeStart, timeFinish;
         
+        //random number generators
+        std::mt19937 rngMultOrder;//initialize in ReadAlign.cpp
+        std::uniform_real_distribution<double> rngUniformReal0to1;//initialize in ReadAlign.cpp
         
         //input,output
         istream* readInStream[MAX_N_MATES];
@@ -107,11 +112,10 @@ class ReadAlign : public Genome {
         
         Transcript *alignC, *extendC, *polyAtailC; //alignment rules/conditions
         
-        intScore trMultScores[MAX_N_MULTMAP];//scores for the multiple mappers
         Transcript* trMult[MAX_N_MULTMAP];//multimapping transcripts
         Transcript *alignTrAll;//alignments to transcriptome       
         
-        ReadAlign (Parameters* Pin, const Genome &genomeIn, Transcriptome *TrIn);//allocate arrays
+        ReadAlign (Parameters* Pin, const Genome &genomeIn, Transcriptome *TrIn, int iChunk);//allocate arrays
         void resetN();//resets the counters to 0
         void multMapSelect();
         int mapOneRead();
diff --git a/source/ReadAlignChunk.cpp b/source/ReadAlignChunk.cpp
index 49dc532..26f4eea 100644
--- a/source/ReadAlignChunk.cpp
+++ b/source/ReadAlignChunk.cpp
@@ -13,7 +13,7 @@ ReadAlignChunk::ReadAlignChunk(Parameters* Pin, Genome &genomeIn, Transcriptome
         chunkTr=NULL;
     };   
     
-    RA = new ReadAlign(P, genomeIn, chunkTr);//new local copy of RA for each chunk
+    RA = new ReadAlign(P, genomeIn, chunkTr, iChunk);//new local copy of RA for each chunk
    
     RA->iRead=0;
     
diff --git a/source/ReadAlignChunk_processChunks.cpp b/source/ReadAlignChunk_processChunks.cpp
index df10dc1..3bdef50 100644
--- a/source/ReadAlignChunk_processChunks.cpp
+++ b/source/ReadAlignChunk_processChunks.cpp
@@ -112,7 +112,7 @@ void ReadAlignChunk::processChunks() {//read-map-write chunks
 //                         };
                     } else {//error
                         ostringstream errOut;
-                        errOut << "ERROR_00201: EXITING because of FATAL ERROR in input reads: unknown file format: the read ID should start with @ or > \n";
+                        errOut << ERROR_OUT <<" EXITING because of FATAL ERROR in input reads: unknown file format: the read ID should start with @ or > \n";
                         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);       
                     };
                 };
@@ -149,7 +149,7 @@ void ReadAlignChunk::processChunks() {//read-map-write chunks
         
     };//cycle over input chunks
     
-    if (P->outFilterBySJoutStage!=1) {//not the first stage of the 2-stage mapping 
+    if (P->outFilterBySJoutStage!=1 && RA->iRead>0) {//not the first stage of the 2-stage mapping 
         if (P->outBAMunsorted) chunkOutBAMunsorted->unsortedFlush();
         if (P->outBAMcoord) chunkOutBAMcoord->coordFlush();
         if (chunkOutBAMquant!=NULL) chunkOutBAMquant->unsortedFlush();
diff --git a/source/ReadAlign_alignBAM.cpp b/source/ReadAlign_alignBAM.cpp
index 0b9e699..6254dde 100644
--- a/source/ReadAlign_alignBAM.cpp
+++ b/source/ReadAlign_alignBAM.cpp
@@ -310,7 +310,7 @@ int ReadAlign::alignBAM(Transcript const &trOut, uint nTrOut, uint iTrOut, uint
                         attrN+=bamAttrArrayWriteInt(nTrOut,"NH",attrOutArray+attrN,P);
                         break;
                     case ATTR_HI:
-                        attrN+=bamAttrArrayWriteInt(iTrOut+1,"HI",attrOutArray+attrN,P);
+                        attrN+=bamAttrArrayWriteInt(iTrOut+P->outSAMattrIHstart,"HI",attrOutArray+attrN,P);
                         break;
                     case ATTR_AS:
                         attrN+=bamAttrArrayWriteInt(trOut.maxScore,"AS",attrOutArray+attrN,P);
diff --git a/source/ReadAlign_chimericDetection.cpp b/source/ReadAlign_chimericDetection.cpp
index 598f09f..ca0aa9f 100644
--- a/source/ReadAlign_chimericDetection.cpp
+++ b/source/ReadAlign_chimericDetection.cpp
@@ -94,9 +94,8 @@ bool ReadAlign::chimericDetection() {
 
                 //segment lengths && (different mates || small gap between segments)
                 if (roEnd1 > P->chimSegmentMin + roStart1 + chimOverlap && roEnd2> P->chimSegmentMin + roStart2 + chimOverlap  \
-                    && ( diffMates || ( (roEnd1 + P->maxChimReadGap + 1) >= roStart2 && (roEnd2 + P->maxChimReadGap + 1) >= roStart1 ) ) ) {
-                                           //maxChimReadGap=0 in Parameters.cpp
-
+                    && ( diffMates || ( (roEnd1 + P->chimSegmentReadGapMax + 1) >= roStart2 && (roEnd2 + P->chimSegmentReadGapMax + 1) >= roStart1 ) ) ) {
+                    
                     int chimScore=trBest->maxScore + trAll[iW][iWt]->maxScore - (int)chimOverlap; //subtract overlap to avoid double counting
 
                     if (chimScore > chimScoreBest && chimScore >= P->chimScoreMin && chimScore+P->chimScoreDropMax >= (int) (readLength[0]+readLength[1]) ) {
@@ -173,7 +172,7 @@ bool ReadAlign::chimericDetection() {
                             if (b1<4) b1=3-b1;
                         };
 
-                        if (b0>3 || b1>3 || bR>3) {//chimera is not called if there are Ns in the genome or in the read
+                        if ( ( P->chimPar.filter.genomicN && (b0>3 || b1>3) ) || bR>3) {//chimera is not called if there are Ns in the genome or in the read
                             chimN=0;
                             break;
                         };
diff --git a/source/ReadAlign_multMapSelect.cpp b/source/ReadAlign_multMapSelect.cpp
index c0c3f06..8267306 100644
--- a/source/ReadAlign_multMapSelect.cpp
+++ b/source/ReadAlign_multMapSelect.cpp
@@ -3,6 +3,7 @@
 #include "Transcript.h"
 #include "ReadAlign.h"
 #include "ErrorWarning.h"
+#include <random>
 
 void ReadAlign::multMapSelect() {//select multiple mappers from all transcripts of all windows
     
@@ -17,8 +18,6 @@ void ReadAlign::multMapSelect() {//select multiple mappers from all transcripts
         exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_BUG, *P);                    
     };
     
-    trBest->primaryFlag=true;
-    
     bool chimRecord = false;
 
     nTr=0;
@@ -33,12 +32,10 @@ void ReadAlign::multMapSelect() {//select multiple mappers from all transcripts
                     exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_PARAMETER, *P);                    
                 };
                     
-                trMultScores[nTr]=trAll[iW][iTr]->maxScore;
                 trMult[nTr]=trAll[iW][iTr];
                 trMult[nTr]->Chr = trAll[iW][0]->Chr;
                 trMult[nTr]->Str = trAll[iW][0]->Str;                  
                 trMult[nTr]->roStr = trAll[iW][0]->roStr;                                 
-                if ( P->outSAMprimaryFlag=="AllBestScore" && trMultScores[nTr] == maxScore ) trMult[nTr]->primaryFlag=true; 
                 
                 if ( (trAll[iW][iTr]->maxScore + P->outFilterMultimapScoreRange) >= maxScore) nTrMate++;
                 
@@ -47,10 +44,75 @@ void ReadAlign::multMapSelect() {//select multiple mappers from all transcripts
         };
     };
     
-    for (uint iTr=0; iTr<nTr; iTr++) {//scan transcripts                 
+    if (nTr > P->outFilterMultimapNmax)
+    {//too multi, no need for further processing, isnce it will be considered unmapped
+        return;
+    };
+    
+    for (uint iTr=0; iTr<nTr; iTr++) 
+    {              
         trMult[iTr]->roStart = trMult[iTr]->roStr==0 ? trMult[iTr]->rStart : Lread - trMult[iTr]->rStart - trMult[iTr]->rLength;
         trMult[iTr]->cStart=trMult[iTr]->gStart - P->chrStart[trMult[iTr]->Chr];                        
     };
 
+//     if (P->outMultimapperOrder.sortCoord)
+//     {//sort multimappers by coordinate
+//         uint *s=new uint[nTr*2];
+//         Transcript **t=new Transcript*[nTr];
+//         for (uint itr=0; itr<nTr; itr++)
+//         {//fill the array of starts and pointers
+//             s[itr*2]=trMult[itr]->exons[0][EX_G];
+//             s[itr*2+1]=itr;
+//             t[itr]=trMult[itr];
+//         };
+//         qsort((void*) s, nTr, sizeof(uint)*2, funCompareUint1);
+//         for (uint itr=0; itr<nTr; itr++)
+//         {
+//             trMult[itr]=t[s[itr*2+1]];
+//         };
+//         delete [] s;        
+//     };
+    
+    if (P->outMultimapperOrder.random && nTr>1)
+    {//randomize order of the alignments
+        int nbest=0;
+        for (uint itr=0; itr<nTr; itr++)
+        {//move the best aligns to the top of the list
+            if ( trMult[itr]->maxScore == maxScore ) 
+            {
+                swap(trMult[itr],trMult[nbest]);
+                ++nbest;
+            };
+        };
+        //shuffle separately the best aligns, and the rest
+        for (int itr=nbest-1; itr>=1; itr--)
+        {//Fisher-Yates-Durstenfeld-Knuth shuffle
+            int rand1=int (rngUniformReal0to1(rngMultOrder)*itr+0.5);
+            swap(trMult[itr],trMult[rand1]);
+        };
+        for (int itr=nTr-nbest-1; itr>=1; itr--)
+        {//Fisher-Yates-Durstenfeld-Knuth shuffle
+            int rand1=int (rngUniformReal0to1(rngMultOrder)*itr+0.5);
+            swap(trMult[nbest+itr],trMult[nbest+rand1]);
+        };
+    };    
+    
+    if ( P->outSAMprimaryFlag=="AllBestScore" )
+    {
+        for (uint itr=0; itr<nTr; itr++)
+        {//mark all best score aligns as primary
+            if ( trMult[itr]->maxScore == maxScore ) trMult[itr]->primaryFlag=true; 
+        };
+    } else if (P->outMultimapperOrder.random) 
+    {
+        for (uint itr=0; itr<nTr; itr++)
+        {//mark as primary the first one in the random ordered list
+            if ( trMult[itr]->maxScore == maxScore ) trMult[itr]->primaryFlag=true;
+            break;
+        };
+    } else
+    {//old way
+        trBest->primaryFlag=true;    
+    };
 };
 
diff --git a/source/ReadAlign_outputAlignments.cpp b/source/ReadAlign_outputAlignments.cpp
index c7d4f2c..141d809 100644
--- a/source/ReadAlign_outputAlignments.cpp
+++ b/source/ReadAlign_outputAlignments.cpp
@@ -30,6 +30,7 @@ void ReadAlign::outputAlignments() {
     } else {//output transcripts
 
         outFilterPassed=true;
+        
         if (P->outFilterBySJoutStage==1) {//filtering by SJout
             for (uint iTr=0;iTr<nTr;iTr++) {//check transcript for unannotated junctions
                 for (uint iex=0;iex<trMult[iTr]->nExons-1;iex++) {//check all junctions
@@ -47,7 +48,7 @@ void ReadAlign::outputAlignments() {
                 
 //                 if (P->runThreadN>1) pthread_mutex_lock(&g_threadChunks.mutexOutFilterBySJout);
                 for (uint im=0;im<P->readNmates;im++) {
-                   chunkOutFilterBySJoutFiles[im] << readNameMates[im] << "/" <<im+1 <<" "<< iReadAll <<" "<< readFilter <<" "<< readFilesIndex;
+                   chunkOutFilterBySJoutFiles[im] << readNameMates[im] <<" "<< iReadAll <<" "<< readFilter <<" "<< readFilesIndex;
                    chunkOutFilterBySJoutFiles[im] <<"\n";
                    chunkOutFilterBySJoutFiles[im] << Read0[im] <<"\n";
                     if (readFileType==2) {//fastq
@@ -67,6 +68,21 @@ void ReadAlign::outputAlignments() {
         };        
 
         if (outFilterPassed) {
+            bool outSAMfilterYes=true;
+            if (P->outSAMfilter.yes)
+            {
+                if (P->outSAMfilter.KeepOnlyAddedReferences)
+                {
+                     for (uint itr=0;itr<nTr;itr++) 
+                     {//check if transcripts map to chr other than added references
+                         if (trMult[itr]->Chr<P->genomeInsertChrIndFirst)
+                         {
+                             outSAMfilterYes=false;
+                             break;
+                         };
+                     };
+                };
+            };            
             if (nTr>1) {//multimappers
                 statsRA.mappedReadsM++;
                 unmapType=-1;
@@ -80,17 +96,19 @@ void ReadAlign::outputAlignments() {
                 exitWithError(errOut.str(), std::cerr, P->inOut->logMain, EXIT_CODE_BUG, *P);                    
             };            
             
-            if (P->outSAMbool){//SAM output
-                for (uint iTr=0;iTr<nTr;iTr++) {//write all transcripts
+            uint nTrOut=min(P->outSAMmultNmax,nTr); //number of to write to SAM/BAM files
+            
+            if (P->outSAMbool && outSAMfilterYes){//SAM output
+                for (uint iTr=0;iTr<nTrOut;iTr++) {//write all transcripts
                     outBAMbytes+=outputTranscriptSAM(*(trMult[iTr]), nTr, iTr, (uint) -1, (uint) -1, 0, -1, NULL, outSAMstream);
                 };
             };
             
-            if (P->outBAMunsorted || P->outBAMcoord) {//BAM output
-                for (uint iTr=0;iTr<nTr;iTr++) {//write all transcripts                     
+            if ((P->outBAMunsorted || P->outBAMcoord) && outSAMfilterYes) {//BAM output
+                for (uint iTr=0;iTr<nTrOut;iTr++) {//write all transcripts                     
                     alignBAM(*(trMult[iTr]), nTr, iTr, P->chrStart[trMult[iTr]->Chr], (uint) -1, (uint) -1, 0, -1, NULL, P->outSAMattrOrder,outBAMoneAlign, outBAMoneAlignNbytes);
                     for (uint imate=0; imate<P->readNmates; imate++) {//output each mate
-                        if (P->outBAMunsorted) outBAMunsorted->unsortedOneAlign(outBAMoneAlign[imate], outBAMoneAlignNbytes[imate], (imate>0 || iTr>0) ? 0 : (outBAMoneAlignNbytes[0]+outBAMoneAlignNbytes[1])*2*nTr);
+                        if (P->outBAMunsorted) outBAMunsorted->unsortedOneAlign(outBAMoneAlign[imate], outBAMoneAlignNbytes[imate], (imate>0 || iTr>0) ? 0 : (outBAMoneAlignNbytes[0]+outBAMoneAlignNbytes[1])*2*nTrOut);
                         if (P->outBAMcoord)    outBAMcoord->coordOneAlign(outBAMoneAlign[imate], outBAMoneAlignNbytes[imate], (iReadAll<<32) | (iTr<<8) | trMult[iTr]->exons[0][EX_iFrag] );                        
                     };
                 };             
@@ -146,7 +164,7 @@ void ReadAlign::outputAlignments() {
     };
     if (unmapType>=0 && P->outReadsUnmapped=="Fastx" ){//output to fasta/q files
            for (uint im=0;im<P->readNmates;im++) {
-               chunkOutUnmappedReadsStream[im] << readNameMates[im] << "/" <<im+1;
+               chunkOutUnmappedReadsStream[im] << readNameMates[im];
                if (P->readNmates>1) chunkOutUnmappedReadsStream[im] <<"\t"<< int(mateMapped[0]) <<  int(mateMapped[1]);
                chunkOutUnmappedReadsStream[im] <<"\n";
                chunkOutUnmappedReadsStream[im] << Read0[im] <<"\n";
diff --git a/source/ReadAlign_outputTranscriptSAM.cpp b/source/ReadAlign_outputTranscriptSAM.cpp
index cc21bc5..f2bcade 100644
--- a/source/ReadAlign_outputTranscriptSAM.cpp
+++ b/source/ReadAlign_outputTranscriptSAM.cpp
@@ -249,7 +249,7 @@ uint ReadAlign::outputTranscriptSAM(Transcript const &trOut, uint nTrOut, uint i
                     *outStream <<"\tNH:i:" << nTrOut;
                     break;
                 case ATTR_HI:
-                    *outStream <<"\tHI:i:"<<iTrOut+1;
+                    *outStream <<"\tHI:i:"<<iTrOut+P->outSAMattrIHstart;
                     break;
                 case ATTR_AS:
                     *outStream<<"\tAS:i:"<<trOut.maxScore;
diff --git a/source/ReadAlign_stitchWindowSeeds.cpp b/source/ReadAlign_stitchWindowSeeds.cpp
index 3c954b4..58a5845 100644
--- a/source/ReadAlign_stitchWindowSeeds.cpp
+++ b/source/ReadAlign_stitchWindowSeeds.cpp
@@ -49,7 +49,8 @@ void ReadAlign::stitchWindowSeeds (uint iW, uint iWrec, char* R, char* Q, char*
             } else {//extend to the left
                 score2=WA[iW][iS1][WA_Length];                
                 if ( WA[iW][iS1][WA_rStart]>0 \
-                     && extendAlign(R, Q, G, WA[iW][iS1][WA_rStart]-1, WA[iW][iS1][WA_gStart]-1, -1, -1, min(WA[iW][iS1][WA_rStart], WA[iW][iS1][WA_gStart] - P->chrStart[WC[iW][WC_Str]]), 100000, 0, outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax1, &trA1) ) {//if could extend
+                     && extendAlign(R, Q, G, WA[iW][iS1][WA_rStart]-1, WA[iW][iS1][WA_gStart]-1, -1, -1, WA[iW][iS1][WA_rStart], 100000, 0, outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax, \
+                                    P->alignEndsType.ext[trA1.exons[0][EX_iFrag]][trA.Str], &trA1) ) {//if could extend
                     score2 += trA1.maxScore;
                 };
                 if (score2 > scoreSeedBest[iS1] ) {
@@ -72,7 +73,8 @@ void ReadAlign::stitchWindowSeeds (uint iW, uint iWrec, char* R, char* Q, char*
        uint tR2=WA[iW][iS1][WA_rStart]+WA[iW][iS1][WA_Length];
        uint tG2=WA[iW][iS1][WA_gStart]+WA[iW][iS1][WA_Length];
        if ( tR2 < Lread-1 \
-            && extendAlign(R, Q, G, tR2, tG2, +1, +1, min(Lread-tR2,P->chrStart[WC[iW][WC_Str]+1]-tG2-1), 100000, scoreSeedBestMM[iS1], outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax1, &trA1) ) {//if could extend
+            && extendAlign(R, Q, G, tR2, tG2, +1, +1, Lread-tR2, 100000, scoreSeedBestMM[iS1], outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax, \
+                           P->alignEndsType.ext[WA[iW][iS1][WA_iFrag]][1-trA.Str], &trA1) ) {//if could extend
            scoreSeedBest[iS1]+=trA1.maxScore;
        };
        if (scoreSeedBest[iS1]>scoreBest) {//record new best transcript
@@ -130,7 +132,8 @@ void ReadAlign::stitchWindowSeeds (uint iW, uint iWrec, char* R, char* Q, char*
             uint iS1=seedChain[seedN-1];
             trA1=*trInit;
             if ( trA.exons[0][EX_R]>0 \
-                 && extendAlign(R, Q, G, trA.exons[0][EX_R]-1, trA.exons[0][EX_G]-1, -1, -1, min(trA.exons[0][EX_R], trA.exons[0][EX_G] - P->chrStart[WC[iW][WC_Str]]), 100000, 0, outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax1, &trA1) ) {//if could extend
+                 && extendAlign(R, Q, G, trA.exons[0][EX_R]-1, trA.exons[0][EX_G]-1, -1, -1, trA.exons[0][EX_R], 100000, 0, outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax, 
+                    P->alignEndsType.ext[trA.exons[0][EX_iFrag]][trA.Str], &trA1) ) {//if could extend
 
                 trA.add(&trA1);
 //                 trA.maxScore += trA1.maxScore + WA[iW][iS1][WA_Length];
@@ -151,7 +154,8 @@ void ReadAlign::stitchWindowSeeds (uint iW, uint iWrec, char* R, char* Q, char*
             uint tR2=WA[iW][iS1][WA_rStart]+WA[iW][iS1][WA_Length];
             uint tG2=WA[iW][iS1][WA_gStart]+WA[iW][iS1][WA_Length];
             if ( tR2 < Lread \
-                && extendAlign(R, Q, G, tR2, tG2, +1, +1, min(Lread-tR2,P->chrStart[WC[iW][WC_Str]+1]-tG2-1), 100000, scoreSeedBestMM[iS1], outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax1, &trA1) ) {//if could extend
+                && extendAlign(R, Q, G, tR2, tG2, +1, +1, Lread-tR2, 100000, scoreSeedBestMM[iS1], outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax, \
+                    P->alignEndsType.ext[trA1.exons[trA.nExons-1][EX_iFrag]][1-trA.Str], &trA1) ) {//if could extend
                     trA.add(&trA1);                    
                     trA.exons[trA.nExons-1][EX_L] += trA1.extendL;//extend the length of the last exon
             };
diff --git a/source/STAR.cpp b/source/STAR.cpp
index 585cf16..3f4106d 100644
--- a/source/STAR.cpp
+++ b/source/STAR.cpp
@@ -1,3 +1,6 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+
 #include "IncludeDefine.h"
 #include "Parameters.h"
 #include "SequenceFuns.h"
@@ -8,10 +11,8 @@
 #include "genomeGenerate.h"
 #include "outputSJ.h"
 #include "ThreadControl.h"
-#include "GlobalVariables.cpp"
+#include "GlobalVariables.h"
 #include "TimeFunctions.h"
-#include <sys/types.h>
-#include <sys/stat.h>
 #include "ErrorWarning.h"
 #include "sysRemoveDir.h"
 #include "BAMfunctions.h"
@@ -19,24 +20,40 @@
 #include "BAMbinSortByCoordinate.h"
 #include "BAMbinSortUnmapped.h"
 #include "signalFromBAM.h"
-// #include "sjdbBuildIndex.h"
 #include "mapThreadsSpawn.h"
 #include "ErrorWarning.h"
-// #include "sjdbLoadFromStream.h"
-// #include "sjdbPrepare.h"
 #include "SjdbClass.h"
 #include "sjdbInsertJunctions.h"
-
+#include "bam_cat.h"
 
 #include "htslib/htslib/sam.h"
-extern int bam_cat(int nfn, char * const *fn, const bam_hdr_t *h, const char* outbam);
+#include "parametersDefault.xxd"
+
+
+
+void usage() {
+    printf("Usage: STAR  [options]... --genomeDir REFERENCE   --readFilesIn R1.fq R2.fq\n");
+    printf("Spliced Transcripts Alignment to a Reference (c) Alexander Dobin, 2009-2015\n\n");
+    
+    std::cout << parametersDefault;
+    
+    printf("For more details see:\n");
+    printf("<https://github.com/alexdobin/STAR>\n");
+    printf("<https://github.com/alexdobin/STAR/blob/master/doc/STARmanual.pdf>\n");
+    
+    exit(0);
+}
+
 
 int main(int argInN, char* argIn[]) {
-   
+    // If no argument is given, or the first argument is either '-h' or '--help', run usage()
+    if((argInN == 1) || (argInN == 2 && (strcmp("-h",argIn[1]) == 0 || strcmp ("--help",argIn[1]) == 0 ))) {
+        usage();
+    }
+
     time(&g_statsAll.timeStart);
-   
+
     Parameters *P = new Parameters; //all parameters
-       
     P->inputParameters(argInN, argIn);
     
     *(P->inOut->logStdOut) << timeMonthDayTime(g_statsAll.timeStart) << " ..... Started STAR run\n" <<flush;           
@@ -60,6 +77,11 @@ int main(int argInN, char* argIn[]) {
     };
     
     P->twoPass.pass2=false; //this is the 1st pass    
+
+    if (P->genomeFastaFiles.at(0)!="-")
+    {//insert sequences in the genome
+        
+    };
     
     SjdbClass sjdbLoci;
 
@@ -70,6 +92,9 @@ int main(int argInN, char* argIn[]) {
         sjdbInsertJunctions(P, P1, mainGenome, sjdbLoci);
     };
 
+
+
+
     //calculate genome-related parameters
     Transcriptome *mainTranscriptome=NULL;
     
diff --git a/extras/doc-latex/STARmanual.tex b/source/STARmanual.tex
similarity index 99%
copy from extras/doc-latex/STARmanual.tex
copy to source/STARmanual.tex
index ca3be10..ab4107a 100644
--- a/extras/doc-latex/STARmanual.tex
+++ b/source/STARmanual.tex
@@ -277,7 +277,7 @@ output both unsorted and sorted files.
 \end{itemize}
 
 \subsection{Splice junctions.}
-\ofilen{SJ.out.tab} contains high confidence collapsed splice junctions in tab-delimited format. The columns have the following meaning:
+\ofilen{SJ.out.tab} contains high confidence collapsed splice junctions in tab-delimited format. Note that STAR defines the junction start/end as intronic bases, while many other software define them as exonic bases. The columns have the following meaning:
 %\begin{enumerate}[label=\bfseries Exercise \arabic*:]
 \begin{itemize}[leftmargin=1in]
 \item[column 1:] chromosome
diff --git a/source/SuffixArrayFuns.cpp b/source/SuffixArrayFuns.cpp
index 3db8ea4..f4837ac 100644
--- a/source/SuffixArrayFuns.cpp
+++ b/source/SuffixArrayFuns.cpp
@@ -272,4 +272,204 @@ uint suffixArraySearch(char** s2, uint S, uint N, char* G, PackedArray& SA, bool
     return i1;
 };
 
+int compareRefEnds (uint64 SAstr,  uint64 gInsert, bool strG, bool strR, Parameters* P)
+{
+    if ( strG)
+    {// + strand g
+       return strR ? (SAstr < gInsert ? 1:-1) : 1;
+    } else
+    {// - strand g
+       return strR ? -1 : ( gInsert==-1LLU ? -1 : ( SAstr < P->nGenome-gInsert ? 1:-1) );
+    };
+};
+
+
+
+uint compareSeqToGenome1(char** s2, uint S, uint N, uint L, char* g, PackedArray& SA, uint iSA, bool dirR, uint64 gInsert, int & compRes, Parameters* P) {
+    // compare s to g, find the maximum identity length
+    // s2[0] read sequence; s2[1] complementary sequence
+    // S position to start search from in s2[0],s2[1]
+    // dirR: strand of the s
+    
+    //different treatment of 5 (spacer) in the sequence and genome
+    // 5 is allowed in the sequence
+    // 5 in the genome is < than 5 in the sequence
+    
+    //TODO no need for complementary sequence
+    
+    register int64 ii;
+    
+    uint SAstr=SA[iSA];
+    bool dirG = (SAstr>>P->GstrandBit) == 0; //forward or reverse strand of the genome
+    SAstr &= P->GstrandMask;
+    
+    
+    if (dirG) {//forward on read, forward on genome
+        char* s  = s2[0] + S + L;
+        g += SAstr + L;
+        for (ii=0;(uint) ii < N-L; ii++)
+        {
+            if (s[ii]!=g[ii]) 
+            {
+                if (s[ii]>g[ii]) 
+                {
+                    compRes=1;
+                    return ii+L;
+                } else 
+                {
+                    compRes=-1;
+                    return ii+L;
+                };
+            } else if (s[ii]==GENOME_spacingChar)
+            {//this already implies the s[ii]==g[ii]
+                compRes=compareRefEnds (SAstr, gInsert, dirG, dirR, P);
+                return ii+L;
+            };
+        };
+//         if (s[ii]>g[ii]) {compRes=true;} else {compRes=false;};        
+        return N; //exact match
+    } else if (!dirG) {
+        char* s  = s2[1] + S + L;
+        g += P->nGenome-1-SAstr - L;
+        for (ii=0; (uint) ii < N-L; ii++)
+        {
+            if (s[ii]!=g[-ii]) 
+            {
+                char s1=s[ii],g1=g[-ii];
+                if (s1<4) s1=3-s1;
+                if (g1<4) g1=3-g1;
+                if (s1>g1) {
+                    compRes=1;
+                    return ii+L;
+                } else 
+                {
+                    compRes=-1;
+                    return ii+L;
+                };                    
+                break;
+            } else if (s[ii]==GENOME_spacingChar)
+            {//this already implies the s[ii]==g[ii]
+                compRes=compareRefEnds (SAstr, gInsert, dirG, dirR, P);
+                return ii+L;
+            };
+        };
+        return N;
+    };    
+};
+
 
+uint suffixArraySearch1(char** s, uint S, uint N, char* g, uint64 gInsert, PackedArray& SA, bool strR, uint i1, uint i2, uint L, Parameters* P) 
+{
+    // binary search in SA space
+    // s[0],s[1] - query sequence, complementary sequence
+    // S - start offset
+    // N - sequence length
+    // g - genome sequence
+    // gInsert - index where the sequence insertion happened
+    // SA - suffix array
+    // strR - strand of the query sequence
+    // i1,i2 = starting indices in SA    
+    // L - starting length
+    // output: first SA index > searched string, i.e. g[SA[index-1]]<s<g[SA[index]]
+    
+    int compRes;
+    
+    uint L1=compareSeqToGenome1(s,S,N,L,g,SA,i1,strR,gInsert,compRes, P);
+    if (compRes<0)
+    {// the sequence is smaller than the first index of the SA, cannot proceed
+        L=L1;
+        return 0;
+    };
+
+    uint L2=compareSeqToGenome1(s,S,N,L,g,SA,i2,strR,gInsert,compRes, P);    
+    if (compRes>0)
+    {//the sequence is bigger than the last SA index, return a huge number
+        L=L2;
+        return -2llu;
+    };
+    
+    L=min(L1,L2);
+    
+    uint i3=i1,L3=L1; //in case i1+1>=i2 an not iteration of the loope below is ever made
+    while (i1+1<i2) {//main binary search loop
+        i3=medianUint2(i1,i2);
+        L3=compareSeqToGenome1(s,S,N,L,g,SA,i3,strR,gInsert,compRes, P);//cannot do this because these sj sequences contains spacers=5
+        if (L3==N) {//this should not really happen
+            L=N;
+            return i3;
+//             cerr << "Bug L3==N"<<endl;
+//             exit(-1); //found exact match of the whole read length, exit the binary search        
+        };
+        
+        if (compRes>0) 
+        { //move 1 to 3
+            i1=i3;L1=L3;
+        } else if (compRes<0)
+        {//move 2 to 3
+            i2=i3;L2=L3;
+        }  
+        L= min(L1,L2);
+    };
+    return i2; //index at i2 is always bigger than the sequence
+};
+
+uint funCalcSAiFromSA(char* G, PackedArray& SA, uint iSA, int L, Parameters* P, int & iL4)
+{
+    uint SAstr=SA[iSA];
+    bool dirG = (SAstr>>P->GstrandBit) == 0; //forward or reverse strand of the genome
+    SAstr &= P->GstrandMask;
+    iL4=-1;
+    register uint saind=0;
+    if (dirG) 
+    {
+        register uint128 g1=*( (uint128*) (G+SAstr) );
+        for (int ii=0; ii<L; ii++)
+        {
+            register char g2=(char) g1;
+            if (g2>3)
+            {
+                iL4=ii;
+                saind <<= 2*(L-ii);
+                return saind;
+            };
+            saind=saind<<2;
+            saind+=g2;
+            g1=g1>>8;
+        };
+        return saind;
+    } else
+    {
+        register uint128 g1=*( (uint128*) (G+P->nGenome-SAstr-16) );
+        for (int ii=0; ii<L; ii++)
+        {
+            register char g2=(char) (g1>>(8*(15-ii)));
+            if (g2>3)
+            {
+                iL4=ii;
+                saind <<= 2*(L-ii);
+                return saind;
+            };
+            saind=saind<<2;
+            saind+=3-g2;
+        };
+        return saind;
+    };
+    
+};
+         
+
+
+
+int64 funCalcSAi(char* G, uint iL) {
+    int64 ind1=0;
+    for (uint iL1=0;iL1<=iL;iL1++) {
+        uint g=(uint) G[iL1];
+        if (g>3) {
+            return -ind1;
+        } else {
+            ind1 <<= 2;
+            ind1 += g;
+        };
+   };
+   return ind1;
+};
diff --git a/source/SuffixArrayFuns.h b/source/SuffixArrayFuns.h
index cfd8b1a..efbeb50 100644
--- a/source/SuffixArrayFuns.h
+++ b/source/SuffixArrayFuns.h
@@ -12,5 +12,7 @@ uint maxMappableLength(char** s, uint S, uint N, char* g, PackedArray& SA, uint
 void writePacked( char* a, uint jj, uint x);
 uint readPacked(char* a, uint jj);
 uint suffixArraySearch(char** s, uint S, uint N, char* g, PackedArray& SA, bool dirR, uint i1, uint i2, uint L, Parameters* P);
-
+uint suffixArraySearch1(char** s2, uint S, uint N, char* G, uint64 gInsert, PackedArray& SA, bool dirR, uint i1, uint i2, uint L, Parameters* P);
+int64 funCalcSAi(char* G, uint iL);
+uint funCalcSAiFromSA(char* G, PackedArray& SA, uint iSA, int L, Parameters* P, int & iL4);
 #endif
diff --git a/source/Transcriptome.cpp b/source/Transcriptome.cpp
index 5b9f51a..fddcd16 100644
--- a/source/Transcriptome.cpp
+++ b/source/Transcriptome.cpp
@@ -2,8 +2,6 @@
 #include "streamFuns.h"
 #include "GlobalVariables.h"
 
-//"ERROR_011000"
-
 Transcriptome::Transcriptome (Parameters* Pin) {
     
     P=Pin;
@@ -12,8 +10,7 @@ Transcriptome::Transcriptome (Parameters* Pin) {
     if ( P->quant.trSAM.yes ) {//load exon-transcript structures
         //load tr and ex info
 
-        ifstream trinfo;
-        ifstrOpen(trInfoDir+"/transcriptInfo.tab", "ERROR_011001", "SOLUTION: utilize --sjdbGTFfile /path/to/annotantions.gtf option at the genome generation step or mapping step",P, trinfo);
+        ifstream & trinfo = ifstrOpen(trInfoDir+"/transcriptInfo.tab", ERROR_OUT, "SOLUTION: utilize --sjdbGTFfile /path/to/annotantions.gtf option at the genome generation step or mapping step",P);
 
         trinfo >> nTr;
         trS=new uint [nTr];
@@ -33,8 +30,7 @@ Transcriptome::Transcriptome (Parameters* Pin) {
 
         trinfo.close();
 
-        ifstream exinfo;
-        ifstrOpen(trInfoDir+"/exonInfo.tab", "ERROR_011002", "SOLUTION: utilize --sjdbGTFfile /path/to/annotantions.gtf option at the genome generation step or mapping step", P, exinfo);
+        ifstream & exinfo = ifstrOpen(trInfoDir+"/exonInfo.tab", ERROR_OUT, "SOLUTION: utilize --sjdbGTFfile /path/to/annotantions.gtf option at the genome generation step or mapping step", P);
 
         exinfo >> nEx;
         exSE = new uint32 [2*nEx];
@@ -52,8 +48,7 @@ Transcriptome::Transcriptome (Parameters* Pin) {
     };
     
     if ( P->quant.geCount.yes ) {//load exon-gene structures
-        ifstream exinfo;
-        ifstrOpen(trInfoDir+"/exonGeTrInfo.tab", "ERROR_011003", "SOLUTION: utilize --sjdbGTFfile /path/to/annotantions.gtf option at the genome generation step or mapping step", P, exinfo);
+        ifstream & exinfo = ifstrOpen(trInfoDir+"/exonGeTrInfo.tab", ERROR_OUT, "SOLUTION: utilize --sjdbGTFfile /path/to/annotantions.gtf option at the genome generation step or mapping step", P);
         exinfo >> exG.nEx;
 
         exG.s=new uint64[exG.nEx];
@@ -77,8 +72,7 @@ Transcriptome::Transcriptome (Parameters* Pin) {
             exG.eMax[iex]=max(exG.eMax[iex-1],exG.e[iex]);
         };        
         
-        ifstream geStream;
-        ifstrOpen(trInfoDir+"/geneInfo.tab", "ERROR_011004", "SOLUTION: utilize --sjdbGTFfile /path/to/annotantions.gtf option at the genome generation step or mapping step", P, geStream);
+        ifstream & geStream = ifstrOpen(trInfoDir+"/geneInfo.tab", ERROR_OUT, "SOLUTION: utilize --sjdbGTFfile /path/to/annotantions.gtf option at the genome generation step or mapping step", P);
         geStream >> nGe;
         geID.resize(nGe);
         for (uint ii=0;ii<nGe;ii++) {
diff --git a/source/VERSION b/source/VERSION
index c6cf43b..02ad3a4 100644
--- a/source/VERSION
+++ b/source/VERSION
@@ -1 +1 @@
-#define STAR_VERSION "STAR_2.4.2a"
+#define STAR_VERSION "STAR_2.5.0a"
diff --git a/source/bam_cat.c b/source/bam_cat.c
index 8eef202..944cafb 100644
--- a/source/bam_cat.c
+++ b/source/bam_cat.c
@@ -16,6 +16,7 @@ Illumina.
 2014-06-27: Alex Dobin modified the code slighlty:
 * to compile with only htslib, no need for samtools package
 * removed the samtools interface function (main)
+* added header file "bam_cat.h"
 
 
 ########## License:
@@ -45,6 +46,8 @@ THE SOFTWARE.
 
 */
 
+#include "bam_cat.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
diff --git a/source/bam_cat.h b/source/bam_cat.h
new file mode 100644
index 0000000..337d150
--- /dev/null
+++ b/source/bam_cat.h
@@ -0,0 +1,8 @@
+#ifndef CODE_bam_cat
+#define CODE_bam_cat
+
+#include "htslib/htslib/sam.h"
+
+int bam_cat(int nfn, char * const *fn, const bam_hdr_t *h, const char* outbam);
+
+#endif
diff --git a/source/extendAlign.cpp b/source/extendAlign.cpp
index 98f35ee..fdcdad3 100644
--- a/source/extendAlign.cpp
+++ b/source/extendAlign.cpp
@@ -3,7 +3,7 @@
 #include "Transcript.h"
 #include "extendAlign.h"
 
-bool extendAlign( char* R, char* Q, char* G, uint rStart, uint gStart, int dR, int dG, uint L, uint Lprev, uint nMMprev, uint nMMmax, double pMMmax, Transcript* trA ) {
+bool extendAlign( char* R, char* Q, char* G, uint rStart, uint gStart, int dR, int dG, uint L, uint Lprev, uint nMMprev, uint nMMmax, double pMMmax, bool extendToEnd, Transcript* trA ) {
 
 // find the maximum score
     
@@ -16,20 +16,20 @@ R=R+rStart;
 Q=Q+rStart;
 G=G+gStart;
 
-if (pMMmax<0) {//end to end extension
+if (extendToEnd) {//end to end extension
 
     int iExt;
     for (iExt=0;iExt<(int) L;iExt++) {
         iS=dR*iExt;
         iG=dG*iExt;
 
-        if (G[iG]==5) {//prohibit extension through chr boundary
-//             trA->extendL=0;
-//             trA->maxScore=-999999999;
-//             trA->nMatch=0;
-//             trA->nMM=nMMmax+1;            
-//             return true; 
-            return false;
+        if ((gStart+iG)==-1 || G[iG]==5) {//prohibit extension through chr boundary
+            trA->extendL=0;
+            trA->maxScore=-999999999;
+            trA->nMatch=0;
+            trA->nMM=nMMmax+1;            
+            return true; 
+//             return false;
         };
         if (R[iS]==MARK_FRAG_SPACER_BASE) break; //no extension through the spacer between fragments
 
@@ -61,7 +61,7 @@ for (int i=0;i<(int) L;i++) {
     iS=dR*i;
     iG=dG*i;
     
-    if (G[iG]==5 || R[iS]==MARK_FRAG_SPACER_BASE) break; //no extension through chr boundary, or through the spacer between fragments
+    if ((gStart+iG)==-1 || G[iG]==5 || R[iS]==MARK_FRAG_SPACER_BASE) break; //no extension through chr boundary, or through the spacer between fragments
     if (R[iS]>3 || G[iG]>3) continue;//no penalties for Ns in reads or genome
     
     if (G[iG]==R[iS]) {//Match
diff --git a/source/extendAlign.h b/source/extendAlign.h
index 7a7d567..853c559 100644
--- a/source/extendAlign.h
+++ b/source/extendAlign.h
@@ -2,4 +2,5 @@
 #include "Parameters.h"
 #include "Transcript.h"
 
-bool extendAlign( char*, char*, char*, uint, uint, int, int, uint, uint, uint, uint, double, Transcript* );
+bool extendAlign( char* R, char* Q, char* G, uint rStart, uint gStart, int dR, int dG, uint L, uint Lprev, uint nMMprev, uint nMMmax, double pMMmax, bool extendToEnd, Transcript* trA );
+
diff --git a/source/funCompareUintAndSuffixes.cpp b/source/funCompareUintAndSuffixes.cpp
new file mode 100644
index 0000000..c62953c
--- /dev/null
+++ b/source/funCompareUintAndSuffixes.cpp
@@ -0,0 +1,40 @@
+#include "funCompareUintAndSuffixes.h"
+#define uint64 unsigned long long
+
+char* globalGenomeArray;
+
+int funCompareUintAndSuffixes ( const void *a, const void *b){
+    uint64* va= ((uint64*) a);
+    uint64* vb= ((uint64*) b);
+
+    if (va[0]>vb[0]) {
+            return 1;
+        } else if (va[0]<vb[0]) {
+            return -1;
+        } else {//compare suffixes
+            char* ga=globalGenomeArray + *( ((uint64*) a)+1);
+            char* gb=globalGenomeArray + *( ((uint64*) b)+1);
+            int ig=0;
+            while (true) {
+                if (ga[ig]>gb[ig]) 
+                {// second condition: reached the end of ga, it's >= than any character, but = does not matter
+                    return 1;
+                } else if (ga[ig]<gb[ig]) 
+                {
+                    return -1;
+                } else if (ga[ig]==5) 
+                {//reached the end of chr, now simply compare the indexes for stable search
+                    if (va[1]>vb[1])
+                    {
+                        return 1;
+                    } else
+                    {//va cannot be equal to vb
+                        return -1;
+                    };
+                } else 
+                {//continue
+                    ig++;
+                };
+            };
+        };
+};
diff --git a/source/funCompareUintAndSuffixes.h b/source/funCompareUintAndSuffixes.h
new file mode 100644
index 0000000..db2a4b6
--- /dev/null
+++ b/source/funCompareUintAndSuffixes.h
@@ -0,0 +1,7 @@
+#ifndef CODE_funCompareUintAndSuffixes
+#define CODE_funCompareUintAndSuffixes
+
+extern char* globalGenomeArray;
+int funCompareUintAndSuffixes ( const void *a, const void *b);
+
+#endif
diff --git a/source/genomeGenerate.cpp b/source/genomeGenerate.cpp
index da204f3..d12f5fc 100644
--- a/source/genomeGenerate.cpp
+++ b/source/genomeGenerate.cpp
@@ -11,6 +11,8 @@
 #include "sjdbPrepare.h"
 #include "genomeParametersWrite.h"
 #include "sjdbInsertJunctions.h"
+#include "genomeScanFastaFiles.h"
+#include "genomeSAindex.h"
 
 #include "serviceFuns.cpp"
 #include "streamFuns.h"
@@ -20,48 +22,71 @@ uint globalL;
 
 
 inline int funCompareSuffixes ( const void *a, const void *b){
-	uint jj=0LLU;
         
-	uint *ga=(uint*)((globalG-7LLU)+(*((uint*)a)));
-	uint *gb=(uint*)((globalG-7LLU)+(*((uint*)b)));
-    uint va=0,vb=0;
-
-	while (va==vb && jj<globalL) {
-		va=*(ga-jj);
-		vb=*(gb-jj);
-		jj++;
-	};
-
-	if (va>vb) {
-		return 1;
-	} else if (va==vb) {
-		return 0;
-	} else {
-		return -1;
-	};
-};
+    uint *ga=(uint*)((globalG-7LLU)+(*((uint*)a)));
+    uint *gb=(uint*)((globalG-7LLU)+(*((uint*)b)));
 
-inline bool funCompareSuffixesBool ( const void *a, const void *b) 
-{
-	uint jj=0LLU;
-        
-	uint *ga=(uint*)((globalG-7LLU)+(*((uint*)a)));
-	uint *gb=(uint*)((globalG-7LLU)+(*((uint*)b)));
+    uint jj=0;
+    int  ii=0;
     uint va=0,vb=0;
+    uint8 *va1, *vb1;
+
+    bool aeqb=true;
+    while (aeqb) {
+        va=*(ga-jj);
+        vb=*(gb-jj);
+        va1=(uint8*) &va;
+        vb1=(uint8*) &vb;
+        for (ii=7;ii>=0;ii--)
+        {
+            if (va1[ii]!=vb1[ii] || va1[ii]==5)
+            {
+                aeqb=false;
+                break;
+            };
+        };
+        jj++;
+    };
 
-	while (va==vb && jj<globalL) {
-		va=*(ga-jj);
-		vb=*(gb-jj);
-		jj++;
-	};
-
-	if (va<vb) {
-        return true;
-	} else {
-		return false;
-	};
+    if (va1[ii]>vb1[ii]) 
+    {
+        return 1;
+    } else if (va1[ii]<vb1[ii]) 
+    {
+        return -1;
+    } else 
+    {//va=vb at the end of chr
+        if ( *((uint*)a) > *((uint*)b) )
+        {//anti-stable order,since indexes are sorted in the reverse order 
+            return  -1;
+        } else
+        {//a cannot be equal to b
+            return 1;
+        };
+    };
 };
 
+// inline bool funCompareSuffixesBool ( const void *a, const void *b) 
+// {
+// 	uint jj=0LLU;
+//         
+// 	uint *ga=(uint*)((globalG-7LLU)+(*((uint*)a)));
+// 	uint *gb=(uint*)((globalG-7LLU)+(*((uint*)b)));
+//     uint va=0,vb=0;
+// 
+// 	while (va==vb && jj<globalL) {
+// 		va=*(ga-jj);
+// 		vb=*(gb-jj);
+// 		jj++;
+// 	};
+// 
+// 	if (va<vb) {
+//         return true;
+// 	} else {
+// 		return false;
+// 	};
+// };
+
 
 inline uint funG2strLocus (uint SAstr, uint const N, char const GstrandBit, uint const GstrandMask) {
     bool strandG = (SAstr>>GstrandBit) == 0;
@@ -70,62 +95,6 @@ inline uint funG2strLocus (uint SAstr, uint const N, char const GstrandBit, uint
     return SAstr;
 };
 
-uint genomeScanFastaFiles (Parameters *P, char* G, bool flagRun) {//scans fasta files. flagRun=false: check and find full size, flaRun=true: collect all the data
-    uint N=0; //total number of bases in the genome, including chr "spacers"
-    ifstream fileIn;
-    for (uint ii=0;ii<P->genomeFastaFiles.size();ii++) {//all the input files
-        fileIn.open(P->genomeFastaFiles.at(ii).c_str());
-        if ( !fileIn.good() ) {//
-            ostringstream errOut;
-            errOut << "EXITING because of INPUT ERROR: could not open genomeFastaFile: " <<P->genomeFastaFiles.at(ii) <<"\n";
-            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);            
-        };
-        while(!fileIn.eof()) {//read each file until eof
-            string lineIn (4096,'.');
-            getline(fileIn,lineIn);
-            if (lineIn[0]=='>') {//new chromosome
-                if (!flagRun) {
-                    istringstream lineInStream (lineIn);
-                    lineInStream.ignore(1,' ');
-                    string chrName1;
-                    lineInStream >> chrName1;
-                    P->chrName.push_back(chrName1);
-                };
-                
-                if (!flagRun && P->chrStart.size()>0) P->chrLength.push_back(N-P->chrStart.at(P->chrStart.size()-1)); //true length of the chr  
-                
-                if (N>0) {//pad the chromosomes to bins boudnaries
-                    N = ( (N+1)/P->genomeChrBinNbases+1 )*P->genomeChrBinNbases;
-                };
-
-                if (!flagRun) {
-                    P->chrStart.push_back(N);    
-                    P->inOut->logMain << P->genomeFastaFiles.at(ii)<<" : chr # " << P->chrStart.size()-1 << "  \""<<P->chrName.at(P->chrStart.size()-1)<<"\" chrStart: "<<N<<"\n"<<flush;
-                };
-            } else {//char lines
-                if (flagRun) lineIn.copy(G+N,lineIn.size(),0);
-                N += lineIn.size();
-            };
-        };
-        fileIn.close();        
-    };
-    
-   
-    if (!flagRun) P->chrLength.push_back(N-P->chrStart.at(P->chrStart.size()-1)); //true length of the chr  
-
-    N = ( (N+1)/P->genomeChrBinNbases+1)*P->genomeChrBinNbases;
-        
-    if (!flagRun) { 
-        P->nChrReal=P->chrStart.size();
-        P->chrStart.push_back(N); //last chromosome end
-        for (uint ii=0;ii<P->nChrReal;ii++) {
-            P->chrNameIndex[P->chrName[ii]]=ii;
-        };
-    };
-    
-    return N;
-};        
-
 void genomeGenerate(Parameters *P) {
     
     //check parameters
@@ -161,7 +130,7 @@ void genomeGenerate(Parameters *P) {
     //define some parameters from input parameters
     P->genomeChrBinNbases=1LLU << P->genomeChrBinNbits;
     //write genome parameters file
-    genomeParametersWrite(P->genomeDir+("/genomeParameters.txt"), P, "ERROR_00102");
+    genomeParametersWrite(P->genomeDir+("/genomeParameters.txt"), P, ERROR_OUT);
     
     char *G=NULL, *G1=NULL;        
     uint nGenomeReal=genomeScanFastaFiles(P,G,false);//first scan the fasta file to find all the sizes  
@@ -174,37 +143,18 @@ void genomeGenerate(Parameters *P) {
     
     memset(G1,GENOME_spacingChar,nG1alloc);//initialize to K-1 all bytes
  
-    genomeScanFastaFiles(P,G,true);    //load the genome sequence
-     
-    //convert the genome to 0,1,2,3,4
-    for (uint jj=0;jj<nGenomeReal;jj++) {
-        switch (int(G[jj])){
-            case(65): case(97):  G[jj]=char(0);break;//A
-            case(67): case(99):  G[jj]=char(1);break;//C           
-            case(71): case(103): G[jj]=char(2);break;//G                       
-            case(84): case(116): G[jj]=char(3);break;//T                                
-            case(78): case(110): G[jj]=char(4);break;//N
-            case(48):            G[jj]=GENOME_spacingChar;break;//chromosomal breaks within the sequences
-            default:              //anything else
-                if (G[jj]!=GENOME_spacingChar) {
-//                     P->inOut->logMain << "Unexpected character: char="<< G[jj] << "   int="<<int(G[jj])<<"   at " << jj << " , replacing with N\n";
-                     G[jj]=char(4);                                 
-                };
-        };
-    };    
+    genomeScanFastaFiles(P,G,true);    //load the genome sequence   
 
     uint N = nGenomeReal;
     P->nGenome=N;
     uint N2 = N*2;     
 
-    ofstream chrN,chrS,chrL,chrNL;
-    
-    ofstrOpen(P->genomeDir+"/chrName.txt","ERROR_00103", P, chrN);   
-    ofstrOpen(P->genomeDir+"/chrStart.txt","ERROR_00103", P, chrS);   
-    ofstrOpen(P->genomeDir+"/chrLength.txt","ERROR_00103", P, chrL);   
-    ofstrOpen(P->genomeDir+"/chrNameLength.txt","ERROR_00103", P, chrNL);   
+    ofstream & chrN = ofstrOpen(P->genomeDir+"/chrName.txt",ERROR_OUT, P);
+    ofstream & chrS = ofstrOpen(P->genomeDir+"/chrStart.txt",ERROR_OUT, P);
+    ofstream & chrL = ofstrOpen(P->genomeDir+"/chrLength.txt",ERROR_OUT, P);
+    ofstream & chrNL = ofstrOpen(P->genomeDir+"/chrNameLength.txt",ERROR_OUT, P);
     
-    for (uint ii=0;ii<P->nChrReal;ii++) {//output names, starts, lengths               
+    for (uint ii=0;ii<P->nChrReal;ii++) {//output names, starts, lengths
         chrN<<P->chrName[ii]<<"\n";
         chrS<<P->chrStart[ii]<<"\n";
         chrL<<P->chrLength.at(ii)<<"\n";
@@ -236,7 +186,6 @@ void genomeGenerate(Parameters *P) {
     if (P->GstrandBit<32) P->GstrandBit=32; //TODO: use simple access function for SA
     
     P->GstrandMask = ~(1LLU<<P->GstrandBit);
-    P->nSAbyte=P->nSA*(P->GstrandBit+1)/8+1;
     PackedArray SA1;//SA without sjdb
     SA1.defineBits(P->GstrandBit+1,P->nSA);
     PackedArray SA2;//SA with sjdb, reserve more space
@@ -249,20 +198,21 @@ void genomeGenerate(Parameters *P) {
     };
         
     P->inOut->logMain  << "Number of SA indices: "<< P->nSA << "\n"<<flush;    
-    P->inOut->logMain  << "SA size in bytes: "<< P->nSAbyte << "\n"<<flush;
 
     //sort SA
     time ( &rawTime );
     P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... starting to sort  Suffix Array. This may take a long time...\n" <<flush;   
     *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... starting to sort  Suffix Array. This may take a long time...\n" <<flush;
+   
 
-    for (uint ii=0;ii<N;ii++) {//re-fill the array backwards for sorting
-        swap(G[N2-1-ii],G[ii]);
-    };          
-    globalG=G;
-    globalL=L/sizeof(uint);        
-
-    {//not enough RAM, split into chunks          
+//     if (false)
+    {//sort SA chunks
+        
+        for (uint ii=0;ii<N;ii++) {//re-fill the array backwards for sorting
+            swap(G[N2-1-ii],G[ii]);
+        };          
+        globalG=G;
+        globalL=L/sizeof(uint);
         //count the number of indices with 4nt prefix
         uint indPrefN=1LLU << 16;
         uint* indPrefCount = new uint [indPrefN];
@@ -308,7 +258,7 @@ void genomeGenerate(Parameters *P) {
         *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... sorting Suffix Array chunks and saving them to disk...\n" <<flush;
 
         #pragma omp parallel for num_threads(P->runThreadN) ordered schedule(dynamic,1)
-        for (int iChunk=0; (uint)iChunk < saChunkN; iChunk++) {//start the chunk cycle: sort each chunk with qsort and write to a file
+        for (int iChunk=0; iChunk < (int) saChunkN; iChunk++) {//start the chunk cycle: sort each chunk with qsort and write to a file
             uint* saChunk=new uint [indPrefChunkCount[iChunk]];//allocate local array for each chunk
             for (uint ii=0,jj=0;ii<N2;ii+=P->genomeSAsparseD) {//fill the chunk with SA indices
                 if (G[ii]<4) {
@@ -328,10 +278,9 @@ void genomeGenerate(Parameters *P) {
                 saChunk[ii]=N2-1-saChunk[ii];
             };  
             //write files
-            ofstream saChunkFile;
             string chunkFileName=P->genomeDir+"/SA_"+to_string( (uint) iChunk);
-            ofstrOpen(chunkFileName,"ERROR_00105", P, saChunkFile);   
-            fstreamWriteBig(saChunkFile, (char*) saChunk, sizeof(saChunk[0])*indPrefChunkCount[iChunk],chunkFileName,"ERROR_00121",P);
+            ofstream & saChunkFile = ofstrOpen(chunkFileName,ERROR_OUT, P);   
+            fstreamWriteBig(saChunkFile, (char*) saChunk, sizeof(saChunk[0])*indPrefChunkCount[iChunk],chunkFileName,ERROR_OUT,P);
             saChunkFile.close();
             delete [] saChunk;
             saChunk=NULL;
@@ -405,95 +354,31 @@ void genomeGenerate(Parameters *P) {
 ////////////////////////////////////////
 //          SA index
 //
-    time(&rawTime);    
-    timeString=asctime(localtime ( &rawTime ));
-    timeString.erase(timeString.end()-1,timeString.end());
-    P->inOut->logMain    << timeMonthDayTime(rawTime) <<" ... starting to generate Suffix Array index...\n" <<flush;   
-    *P->inOut->logStdOut << timeMonthDayTime(rawTime) <<" ... starting to generate Suffix Array index...\n" <<flush; 
-        
-    P->genomeSAindexStart = new uint [P->genomeSAindexNbases+1];
-    P->genomeSAindexStart[0]=0;
-    for (uint ii=1;ii<=P->genomeSAindexNbases;ii++) {//L-mer indices starts
-        P->genomeSAindexStart[ii] = P->genomeSAindexStart[ii-1] + ( 1LLU<<(2*ii) );
-    };
-    P->nSAi = P->genomeSAindexStart[P->genomeSAindexNbases];
-    
-    uint* SAi=new uint[P->nSAi];
-//     for (uint isa=0; isa<P->nSAi; isa++) {//initialize
-//         SAi[isa]=P->nSA; //if the suffix is not found in the genome, it's location will be marked with this value
+//     PackedArray SAold;
+// 
+//     if (true)
+//     {//testing: load SA from disk
+//             //read chunks and pack into full SA1
+//         
+//         ifstream oldSAin("./DirTrue/SA");
+//         oldSAin.seekg (0, ios::end);
+//         P->nSAbyte=(uint) oldSAin.tellg();
+//         oldSAin.clear();        
+//         oldSAin.seekg (0, ios::beg);
+// 
+//         P->nSA=(P->nSAbyte*8)/(P->GstrandBit+1);
+//         SAold.defineBits(P->GstrandBit+1,P->nSA);  
+//         SAold.allocateArray();
+//         
+//         oldSAin.read(SAold.charArray,SAold.lengthByte);
+//         oldSAin.close();
+//         
+//         SA1=SAold;
+//         SA2=SAold;
 //     };
     
-    uint* ind0=new uint[P->genomeSAindexNbases];
-    uint* indSAlast=new uint[P->genomeSAindexNbases];
-
-    for (uint ii=0; ii<P->genomeSAindexNbases; ii++) {
-        ind0[ii]=-1;//this is needed in case "AAA...AAA",i.e. indPref=0 is not present in the genome for some lengths
-        indSAlast[ii]=P->nSA;//that's probably not needed
-    };
-
-    P->SAiMarkNbit=P->GstrandBit+1;
-    P->SAiMarkAbsentBit=P->GstrandBit+2;
-    
-    P->SAiMarkNmaskC=1LLU << P->SAiMarkNbit;
-    P->SAiMarkNmask=~P->SAiMarkNmaskC;
-    P->SAiMarkAbsentMaskC=1LLU << P->SAiMarkAbsentBit;
-    P->SAiMarkAbsentMask=~P->SAiMarkAbsentMaskC;
-       
-    
-    for (uint isa=0; isa<P->nSA; isa++) {//for all suffixes
-        if (isa%100000000==0) P->inOut->logMain  << isa*100/P->nSA << "% " << flush;         
-        
-        uint SAstr=SA1[isa];
-        bool dirG = (SAstr>>P->GstrandBit) == 0; //forward or reverse strand of the genome
-        SAstr &= P->GstrandMask;
-        if (!dirG) SAstr=P->nGenome-1-SAstr;
-
-        uint indPref=0;
-        for (uint iL=0; iL < P->genomeSAindexNbases; iL++) {//calculate index
-
-            indPref <<= 2;
-            
-            uint g1= (uint) G[dirG ? SAstr+iL : SAstr-iL]; //reverese if (-) strand
-
-            if (g1>3) {//if N, this suffix does not belong in SAi
-                for (uint iL1=iL; iL1 < P->genomeSAindexNbases; iL1++) {
-                    SAi[P->genomeSAindexStart[iL1]+ind0[iL1]] |= P->SAiMarkNmaskC;
-                };
-                break;
-            };
-
-            if (!dirG) g1=3-g1; //complement if (-) strand
-
-            indPref += (uint) g1;
-            
-            if ( indPref > ind0[iL] || isa==0 ) {//new && good index, record it
-                SAi[P->genomeSAindexStart[iL]+indPref]=isa;
-                for (uint ii=ind0[iL]+1; ii<indPref; ii++) {//index is not present, record to the last present suffix
-                    SAi[P->genomeSAindexStart[iL]+ii] = isa | P->SAiMarkAbsentMaskC; 
-                };
-                ind0[iL]=indPref;
-//                 indSAlast[iL]=isa;
-//             } else if (indPref==ind0[iL]) {
-//                 indSAlast[iL]=isa;//last SA index with the same prefix 
-            } else if ( indPref < ind0[iL] ) {
-                ostringstream errOut;
-                errOut << "BUG: next index is smaller than previous, EXITING\n" <<flush;
-                exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
-            };
-        };
-    };//for (uint isa=0; isa<P->nSA; isa++)
-    P->inOut->logMain << " done\n"<<flush;
-   
-    //pack SAi
     PackedArray SAip;
-    SAip.defineBits(P->GstrandBit+3,P->nSAi);//SAi uses an extra bit compared to SA because it needs to store values > nSA
-    SAip.pointArray((char*) SAi);
-    for (uint ii=0;ii<SAip.length;ii++) {
-        SAip.writePacked(ii,SAi[ii]);
-    };
-    
-    delete [] indSAlast;
-    delete [] ind0;
+    genomeSAindex(G,SA1,P,SAip);
 
     if (P->sjdbFileChrStartEnd.at(0)!="-" || P->sjdbGTFfile!="-")
     {//insert junctions
@@ -515,7 +400,8 @@ void genomeGenerate(Parameters *P) {
         
         //write an extra 0 at the end of the array, filling the last bytes that otherwise are not accessible, but will be written to disk
         //this is - to avoid valgrind complaints. Note that SA2 is allocated with plenty of space to spare.
-        SA2.writePacked(P->nSA,0);
+        SA1=mainGenome.SA;
+        SA1.writePacked(P->nSA,0);
     };
     
     //write genome to disk
@@ -523,19 +409,19 @@ void genomeGenerate(Parameters *P) {
     P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... writing Genome to disk ...\n" <<flush;   
     *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... writing Genome to disk ...\n" <<flush;   
     
-    ofstream genomeOut;
-    ofstrOpen(P->genomeDir+"/Genome","ERROR_00104", P, genomeOut);   
-    fstreamWriteBig(genomeOut,G,P->nGenome,P->genomeDir+"/Genome","ERROR_00120",P);
+    ofstream & genomeOut = ofstrOpen(P->genomeDir+"/Genome",ERROR_OUT, P);   
+    fstreamWriteBig(genomeOut,G,P->nGenome,P->genomeDir+"/Genome",ERROR_OUT,P);
     genomeOut.close();  
 
     //write SA                
     time ( &rawTime );
+    P->inOut->logMain  << "SA size in bytes: "<<SA1.lengthByte << "\n"<<flush;
+
     P->inOut->logMain     << timeMonthDayTime(rawTime) <<" ... writing Suffix Array to disk ...\n" <<flush;   
     *P->inOut->logStdOut  << timeMonthDayTime(rawTime) <<" ... writing Suffix Array to disk ...\n" <<flush;   
 
-    ofstream SAout;
-    ofstrOpen(P->genomeDir+"/SA","ERROR_00106", P, SAout);   
-    fstreamWriteBig(SAout,(char*) SA2.charArray, (streamsize) P->nSAbyte,P->genomeDir+"/SA","ERROR_00122",P);
+    ofstream & SAout = ofstrOpen(P->genomeDir+"/SA",ERROR_OUT, P);   
+    fstreamWriteBig(SAout,(char*) SA1.charArray, (streamsize) SA1.lengthByte,P->genomeDir+"/SA",ERROR_OUT,P);
     SAout.close();    
     
     //write SAi
@@ -544,16 +430,14 @@ void genomeGenerate(Parameters *P) {
     *P->inOut->logStdOut << timeMonthDayTime(rawTime) <<" ... writing SAindex to disk\n" <<flush;   
     
     //write SAi to disk
-    ofstream SAiOut;
-    ofstrOpen(P->genomeDir+"/SAindex","ERROR_00107", P, SAiOut);   
+    ofstream & SAiOut = ofstrOpen(P->genomeDir+"/SAindex",ERROR_OUT, P);
 
-    fstreamWriteBig(SAiOut, (char*) &P->genomeSAindexNbases, sizeof(P->genomeSAindexNbases),P->genomeDir+"/SAindex","ERROR_00123",P);
-    fstreamWriteBig(SAiOut, (char*) P->genomeSAindexStart, sizeof(P->genomeSAindexStart[0])*(P->genomeSAindexNbases+1),P->genomeDir+"/SAindex","ERROR_00124",P);        
-    fstreamWriteBig(SAiOut,  SAip.charArray, SAip.lengthByte,P->genomeDir+"/SAindex","ERROR_00125",P);
+    fstreamWriteBig(SAiOut, (char*) &P->genomeSAindexNbases, sizeof(P->genomeSAindexNbases),P->genomeDir+"/SAindex",ERROR_OUT,P);
+    fstreamWriteBig(SAiOut, (char*) P->genomeSAindexStart, sizeof(P->genomeSAindexStart[0])*(P->genomeSAindexNbases+1),P->genomeDir+"/SAindex",ERROR_OUT,P);        
+    fstreamWriteBig(SAiOut,  SAip.charArray, SAip.lengthByte,P->genomeDir+"/SAindex",ERROR_OUT,P);
     SAiOut.close();    
 
     SA2.deallocateArray();
-    delete [] SAi;    
 
     time(&rawTime);
     timeString=asctime(localtime ( &rawTime ));
diff --git a/source/genomeParametersWrite.cpp b/source/genomeParametersWrite.cpp
index 0af13d0..629d0f2 100644
--- a/source/genomeParametersWrite.cpp
+++ b/source/genomeParametersWrite.cpp
@@ -3,8 +3,7 @@
 
 void genomeParametersWrite(string fileName, Parameters* P, string errorOut)
 {//write the genome information into the genomePar stream
-    ofstream genomePar;
-    ofstrOpen(fileName, errorOut, P, genomePar);   
+    ofstream & genomePar = ofstrOpen(fileName, errorOut, P);
     
     genomePar << "### "<<P->commandLineFull <<"\n";
     
diff --git a/source/genomeSAindex.cpp b/source/genomeSAindex.cpp
new file mode 100644
index 0000000..86f36cd
--- /dev/null
+++ b/source/genomeSAindex.cpp
@@ -0,0 +1,265 @@
+#include "genomeSAindex.h" 
+#include "TimeFunctions.h"
+#include "SuffixArrayFuns.h"
+#include "ErrorWarning.h"
+
+void genomeSAindex(char * G, PackedArray & SA, Parameters * P, PackedArray & SAi)
+ {
+    P->genomeSAindexStart = new uint [P->genomeSAindexNbases+1];
+    P->genomeSAindexStart[0]=0;
+    for (uint ii=1;ii<=P->genomeSAindexNbases;ii++) {//L-mer indices starts
+        P->genomeSAindexStart[ii] = P->genomeSAindexStart[ii-1] + ( 1LLU<<(2*ii) );
+    };
+    P->nSAi = P->genomeSAindexStart[P->genomeSAindexNbases];
+    
+    /* testing
+    //     uint* SAi1=new uint[P->nSAi];
+
+    PackedArray SAio;
+    SAio.defineBits(P->GstrandBit+3,P->nSAi);
+    SAio.allocateArray();
+    ifstream oldSAiin("./DirTrue/SAindex");
+    oldSAiin.read(SAio.charArray,8*(P->genomeSAindexNbases+2));//skip first bytes
+    oldSAiin.read(SAio.charArray,SAio.lengthByte);
+    oldSAiin.close();      
+    */
+    
+
+    P->SAiMarkNbit=P->GstrandBit+1;
+    P->SAiMarkAbsentBit=P->GstrandBit+2;
+    
+    P->SAiMarkNmaskC=1LLU << P->SAiMarkNbit;
+    P->SAiMarkNmask=~P->SAiMarkNmaskC;
+    P->SAiMarkAbsentMaskC=1LLU << P->SAiMarkAbsentBit;
+    P->SAiMarkAbsentMask=~P->SAiMarkAbsentMaskC;
+
+   
+    SAi.defineBits(P->GstrandBit+3,P->nSAi);
+    SAi.allocateArray();   
+    
+    time_t rawTime;
+    time(&rawTime);    
+    P->inOut->logMain    << timeMonthDayTime(rawTime) <<" ... Generating Suffix Array index\n" <<flush;   
+    *P->inOut->logStdOut << timeMonthDayTime(rawTime) <<" ... Generating Suffix Array index\n" <<flush; 
+    
+    /*testing
+    PackedArray SA1=SA;
+    uint* ind0=new uint[P->genomeSAindexNbases];
+
+    for (uint ii=0; ii<P->genomeSAindexNbases; ii++) {
+        ind0[ii]=-1;//this is needed in case "AAA...AAA",i.e. indPref=0 is not present in the genome for some lengths
+    };    
+    uint* SAi1=new uint[P->nSAi];
+    
+    for (uint isa=0; isa<P->nSA; isa++) {//for all suffixes
+        if (isa%100000000==0) P->inOut->logMain  << isa*100/P->nSA << "% " << flush;
+
+        uint SAstr=SA1[isa];
+        bool dirG = (SAstr>>P->GstrandBit) == 0; //forward or reverse strand of the genome
+        SAstr &= P->GstrandMask;
+        if (!dirG) SAstr=P->nGenome-1-SAstr;
+
+        uint indPref=0;
+        for (uint iL=0; iL < P->genomeSAindexNbases; iL++) {//calculate index
+
+            indPref <<= 2;
+
+            uint g1= (uint) G[dirG ? SAstr+iL : SAstr-iL]; //reverese if (-) strand
+
+            if (g1>3) {//if N, this suffix does not belong in SAi
+                for (uint iL1=iL; iL1 < P->genomeSAindexNbases; iL1++) {
+                    SAi1[P->genomeSAindexStart[iL1]+ind0[iL1]] |= P->SAiMarkNmaskC;
+                };
+                break;
+            };
+
+            if (!dirG) g1=3-g1; //complement if (-) strand
+
+            indPref += (uint) g1;
+
+            if ( indPref > ind0[iL] || isa==0 ) {//new && good index, record it
+                SAi1[P->genomeSAindexStart[iL]+indPref]=isa;
+                for (uint ii=ind0[iL]+1; ii<indPref; ii++) {//index is not present, record to the last present suffix
+                    SAi1[P->genomeSAindexStart[iL]+ii] = isa | P->SAiMarkAbsentMaskC;
+                };
+                ind0[iL]=indPref;
+            } else if ( indPref < ind0[iL] ) {
+                ostringstream errOut;
+                errOut << "BUG: next index is smaller than previous, EXITING\n" <<flush;
+                exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
+            };
+        };
+    };//for (uint isa=0; isa<P->nSA; isa++)
+    */    
+    
+    genomeSAindexChunk(G, SA, P, SAi, 0, SA.length-1);    
+    
+    time(&rawTime);    
+    P->inOut->logMain    << timeMonthDayTime(rawTime) <<" ... Completed Suffix Array index\n" <<flush;   
+    *P->inOut->logStdOut << timeMonthDayTime(rawTime) <<" ... Completed Suffix Array index\n" <<flush; 
+      
+//     for (uint ii=1;ii<=P->genomeSAindexNbases-1;ii++) {//L-mer indices starts
+//         cout <<ii<<endl;
+//         for (uint jj=P->genomeSAindexStart[ii-1]; jj<P->genomeSAindexStart[ii]; jj++)
+//         {
+//             if (SAi[jj]!=SAio[jj])
+//             {
+//                 cout <<ii <<" "<< jj<<" "<<jj-P->genomeSAindexStart[ii-1]<<" "<<SAi[jj]<<" "<<SAio[jj]<<" "<<endl;
+//                 sleep(100);
+//             };
+//         };
+//     };
+
+    
+ };
+ 
+ 
+void genomeSAindexChunk(char * G, PackedArray & SA, Parameters * P, PackedArray & SAi, uint iSA1, uint iSA2)
+{
+    uint* ind0=new uint[P->genomeSAindexNbases];
+    uint* ind0a=new uint[P->genomeSAindexNbases];
+
+    for (uint ii=0; ii<P->genomeSAindexNbases; ii++) {
+        ind0[ii]=-1;//this is needed in case "AAA...AAA",i.e. indPref=0 is not present in the genome for some lengths
+        ind0a[ii]=-1;//this is needed in case "AAA...AAA",i.e. indPref=0 is not present in the genome for some lengths
+    };   
+    
+    PackedArray SAi1;
+    SAi1=SAi;
+    SAi1.allocateArray();
+    
+    uint isaStep=P->nSA/(1llu<<(2*P->genomeSAindexNbases))+1;
+//     isaStep=8;
+    
+    uint isa=iSA1;
+    int iL4;
+    uint indFull=funCalcSAiFromSA(G,SA,isa,P->genomeSAindexNbases,P,iL4);
+    while (isa<=iSA2) {//for all suffixes
+
+        /* testing
+        uint SAstr=SA[isa];
+        bool dirG = (SAstr>>P->GstrandBit) == 0; //forward or reverse strand of the genome
+        SAstr &= P->GstrandMask;
+        if (!dirG) SAstr=P->nGenome-1-SAstr;
+        uint indPref1=0;
+        */
+        
+        for (uint iL=0; iL < P->genomeSAindexNbases; iL++) {//calculate index
+            /*{//testing: old way
+                indPref1 <<= 2;
+
+                uint g1= (uint) G[dirG ? SAstr+iL : SAstr-iL]; //reverese if (-) strand
+
+                if (g1>3) {//if N, this suffix does not belong in SAi
+                    for (uint iL1=iL; iL1 < P->genomeSAindexNbases; iL1++) {
+                        SAi1.writePacked(P->genomeSAindexStart[iL1]+ind0[iL1],SAi[P->genomeSAindexStart[iL1]+ind0[iL1]] | P->SAiMarkNmaskC);
+                    };
+                } else //relying on the true code to break iL cycle
+                {
+                    if (!dirG) g1=3-g1; //complement if (-) strand
+
+                    indPref1 += (uint) g1;
+
+                    if ( indPref1 > ind0a[iL] || isa==0 ) {//new && good index, record it
+                        SAi1.writePacked(P->genomeSAindexStart[iL]+indPref1, isa);
+                        for (uint ii=ind0a[iL]+1; ii<indPref1; ii++) {//index is not present, record to the last present suffix
+                            SAi1.writePacked(P->genomeSAindexStart[iL]+ii, isa | P->SAiMarkAbsentMaskC); 
+                        };
+                        ind0a[iL]=indPref1;
+                    } else if ( indPref1 < ind0a[iL] ) {
+                        ostringstream errOut;
+                        errOut << "BUG: next index is smaller than previous, EXITING\n" <<flush;
+                        exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
+                    };
+                };
+            };
+            */
+            
+            uint indPref = indFull >> (2*(P->genomeSAindexNbases-1-iL));
+//             if (indPref!=indPref1)
+//                 cout<< iL <<" "<< isa <<" "<< indPref <<" "<<indPref1<<endl;
+            
+
+            if ( iL==iL4 ) {//this suffix contains N and does not belong in SAi
+                for (uint iL1=iL; iL1 < P->genomeSAindexNbases; iL1++) {
+                    SAi.writePacked(P->genomeSAindexStart[iL1]+ind0[iL1],SAi[P->genomeSAindexStart[iL1]+ind0[iL1]] | P->SAiMarkNmaskC);
+//                     if (SAi[P->genomeSAindexStart[iL]+ind0[iL1]] != SAi1[P->genomeSAindexStart[iL]+ind0[iL1]])
+//                         cout<< iL <<" "<< isa <<" "<< indPref <<" "<<indPref1<<endl;
+                    
+                };
+                break;//break the iL cycle
+            };
+
+            if ( indPref > ind0[iL] || isa==0 ) {//new && good index, record it
+                //testing
+//                 if (funCalcSAiFromSA(G,SA,isa,iL+1,P)!=indPref)
+//                     cout<< iL <<" "<< isa <<" "<< indPref <<" "<<funCalcSAiFromSA(G,SA,isa,iL+1,P)<<endl;
+                        
+                SAi.writePacked(P->genomeSAindexStart[iL]+indPref, isa);
+//                 if (SAi[P->genomeSAindexStart[iL]+indPref] != SAi1[P->genomeSAindexStart[iL]+indPref])
+//                     cout<< iL <<" "<< isa <<" "<< indPref <<" "<<indPref1<<endl;
+                
+                for (uint ii=ind0[iL]+1; ii<indPref; ii++) {//index is not present, record to the last present suffix
+                    SAi.writePacked(P->genomeSAindexStart[iL]+ii, isa | P->SAiMarkAbsentMaskC); 
+                };
+                ind0[iL]=indPref;
+
+            } else if ( indPref < ind0[iL] ) {
+                ostringstream errOut;
+                errOut << "BUG: next index is smaller than previous, EXITING\n" <<flush;
+                exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
+            };
+            
+            
+        };
+        
+        //find next index not equal to the current one
+        funSAiFindNextIndex(P, G, SA, isaStep, isa, indFull, iL4);//indFull and iL4 have been already defined at the previous step
+//         isa++;
+//         indFull=funCalcSAiFromSA(G,SA,isa,P->genomeSAindexNbases,P,iL4);
+    };//isa cycle
+    delete [] ind0;
+
+ };
+ 
+void funSAiFindNextIndex(Parameters * P, char * G, PackedArray & SA, uint isaStep, uint & isa, uint & indFull, int & iL4)
+ {
+    uint indFullPrev=indFull;
+    int iL4prev=iL4;
+    isa+=isaStep;
+    while (isa<P->nSA && (indFull=funCalcSAiFromSA(G,SA,isa,P->genomeSAindexNbases,P,iL4))==indFullPrev && iL4==iL4prev)
+    {
+        isa+=isaStep;
+    };
+    if (isa>=P->nSA)
+    {
+        isa=P->nSA-1;
+        indFull=funCalcSAiFromSA(G,SA,isa,P->genomeSAindexNbases,P,iL4);
+        if (indFull==indFullPrev)
+        {
+            isa=P->nSA;//no more indices, the last one is equal to the previous
+            return;
+        };
+    };
+
+    {//binary search
+        uint i1=isa-isaStep;
+        uint i2=isa;
+        while (i1+1<i2)
+        {
+            isa=i1/2 + i2/2 + (i1%2 + i2%2)/2;
+            if ((indFull=funCalcSAiFromSA(G,SA,isa,P->genomeSAindexNbases,P,iL4))==indFullPrev && iL4==iL4prev)
+            {
+                i1=isa;
+            } else
+            {
+                i2=isa;
+            };
+        };
+        if (isa==i1)
+        {
+            isa=i2;                    
+            indFull=funCalcSAiFromSA(G,SA,isa,P->genomeSAindexNbases,P,iL4);
+        };
+    };
+};
\ No newline at end of file
diff --git a/source/genomeSAindex.h b/source/genomeSAindex.h
new file mode 100644
index 0000000..a04a28c
--- /dev/null
+++ b/source/genomeSAindex.h
@@ -0,0 +1,10 @@
+#ifndef CODE_genomeSAindex
+#define CODE_genomeSAindex
+#include "PackedArray.h"
+#include "Parameters.h"
+
+void genomeSAindex(char * G, PackedArray & SA, Parameters * P, PackedArray & SAip);
+void genomeSAindexChunk(char * G, PackedArray & SA, Parameters * P, PackedArray & SAi, uint iSA1, uint iSA2);
+void funSAiFindNextIndex(Parameters * P, char * G, PackedArray & SA, uint isaStep, uint & isa, uint & indFull, int & iL4);
+
+#endif
diff --git a/source/genomeScanFastaFiles.cpp b/source/genomeScanFastaFiles.cpp
new file mode 100644
index 0000000..94f0fd8
--- /dev/null
+++ b/source/genomeScanFastaFiles.cpp
@@ -0,0 +1,100 @@
+#include "genomeScanFastaFiles.h"
+#include "ErrorWarning.h"
+
+
+uint genomeScanFastaFiles (Parameters *P, char* G, bool flagRun) {//scans fasta files. flagRun=false: check and find full size, flaRun=true: collect all the data
+
+    uint N=0;//total number of bases in the genome, including chr "spacers"
+    if (!flagRun && P->chrLength.size()>0) 
+    {//previous chr records exist
+       P->chrStart.pop_back();//remove last record
+       N =  P->chrStart.back()+P->chrLength.back(); 
+    };
+
+    ifstream fileIn;
+    for (uint ii=0;ii<P->genomeFastaFiles.size();ii++) {//all the input files
+        fileIn.open(P->genomeFastaFiles.at(ii).c_str());
+        if ( !fileIn.good() ) 
+        {//
+            ostringstream errOut;
+            errOut << "EXITING because of INPUT ERROR: could not open genomeFastaFile: " <<P->genomeFastaFiles.at(ii) <<"\n";
+            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);            
+        };
+        char cc=fileIn.peek();
+        if ( !fileIn.good() ) 
+        {//
+            ostringstream errOut;
+            errOut << "EXITING because of INPUT ERROR: could not read from genomeFastaFile: " <<P->genomeFastaFiles.at(ii) <<"\n";
+            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);            
+        };      
+        if (cc!='>')
+        {
+            ostringstream errOut;
+            errOut << "EXITING because of INPUT ERROR: the file format of the genomeFastaFile: " <<P->genomeFastaFiles.at(ii) << "is not fasta:";
+            errOut << " the first character is " <<cc<<" , not > .\n";
+            errOut << " Solution: check formatting of the fasta file. Make sure the file is uncompressed (unzipped).\n";
+            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);            
+        };         while(!fileIn.eof()) {//read each file until eof
+            string lineIn (4096,'.');
+            getline(fileIn,lineIn);
+            if (lineIn[0]=='>') {//new chromosome
+                if (!flagRun) {
+                    istringstream lineInStream (lineIn);
+                    lineInStream.ignore(1,' ');
+                    string chrName1;
+                    lineInStream >> chrName1;
+                    P->chrName.push_back(chrName1);
+                };
+                
+                if (!flagRun && P->chrStart.size()>0) P->chrLength.push_back(N-P->chrStart.at(P->chrStart.size()-1)); //true length of the chr  
+                
+                if (N>0) {//pad the chromosomes to bins boudnaries
+                    N = ( (N+1)/P->genomeChrBinNbases+1 )*P->genomeChrBinNbases;
+                };
+
+                if (!flagRun) {
+                    P->chrStart.push_back(N);    
+                    P->inOut->logMain << P->genomeFastaFiles.at(ii)<<" : chr # " << P->chrStart.size()-1 << "  \""<<P->chrName.at(P->chrStart.size()-1)<<"\" chrStart: "<<N<<"\n"<<flush;
+                };
+            } else {//char lines
+                if (flagRun) lineIn.copy(G+N,lineIn.size(),0);
+                N += lineIn.size();
+            };
+        };
+        fileIn.close();        
+    };
+    
+   
+    if (!flagRun) P->chrLength.push_back(N-P->chrStart.at(P->chrStart.size()-1)); //true length of the chr  
+
+    N = ( (N+1)/P->genomeChrBinNbases+1)*P->genomeChrBinNbases;
+        
+    if (!flagRun) 
+    { 
+        P->nChrReal=P->chrStart.size();
+        P->chrStart.push_back(N); //last chromosome end+1
+        for (uint ii=0;ii<P->nChrReal;ii++) {
+            P->chrNameIndex[P->chrName[ii]]=ii;
+        };
+    } else    
+    {//convert the genome to 0,1,2,3,4
+        for (uint jj=0;jj<N;jj++) {
+            switch (int(G[jj])){
+                case(65): case(97):  G[jj]=char(0);break;//A
+                case(67): case(99):  G[jj]=char(1);break;//C           
+                case(71): case(103): G[jj]=char(2);break;//G                       
+                case(84): case(116): G[jj]=char(3);break;//T                                
+                case(78): case(110): G[jj]=char(4);break;//N
+                case(48):            G[jj]=GENOME_spacingChar;break;//chromosomal breaks within the sequences
+                default:              //anything else
+                    if (G[jj]!=GENOME_spacingChar) {
+                         //P->inOut->logMain << "Unexpected character: char="<< G[jj] << "   int="<<int(G[jj])<<"   at " << jj << " , replacing with N\n";
+                         G[jj]=char(4);                                 
+                    };
+            };
+        }; 
+    };
+    
+    return N;
+};        
+
diff --git a/source/genomeScanFastaFiles.h b/source/genomeScanFastaFiles.h
new file mode 100644
index 0000000..459da5d
--- /dev/null
+++ b/source/genomeScanFastaFiles.h
@@ -0,0 +1,9 @@
+#ifndef CODE_genomeScanFastaFiles
+#define CODE_genomeScanFastaFiles
+
+#include "Parameters.h"
+#include "IncludeDefine.h"
+
+uint genomeScanFastaFiles (Parameters *P, char* G, bool flagRun);
+
+#endif
diff --git a/source/insertSeqSA.cpp b/source/insertSeqSA.cpp
new file mode 100644
index 0000000..e8732d4
--- /dev/null
+++ b/source/insertSeqSA.cpp
@@ -0,0 +1,280 @@
+/* 
+ * inserts sequences into the SA 
+ * returns number of SA indexes inserted
+ */
+#include "insertSeqSA.h"
+#include "ErrorWarning.h"
+#include "SuffixArrayFuns.h"
+#include "SequenceFuns.h"
+#include "serviceFuns.cpp"
+#include "streamFuns.h"
+#include "binarySearch2.h"
+#include "funCompareUintAndSuffixes.h"
+#include <cmath>
+#include "genomeSAindex.h" 
+
+uint insertSeqSA(PackedArray & SA, PackedArray & SA1, PackedArray & SAi, char * G, char * G1, uint64 nG, uint64 nG1, uint64 nG2, Parameters * P)
+{//insert new sequences into the SA
+    
+    uint GstrandBit1 = (uint) floor(log(nG+nG1)/log(2))+1;
+    if (GstrandBit1<32) GstrandBit1=32; //TODO: use simple access function for SA
+    if ( GstrandBit1+1 != SA.wordLength) 
+    {//sequence is too long - GstrandBit changed
+        ostringstream errOut;
+        errOut << "EXITING because of FATAL ERROR: cannot insert sequence on the fly because of strand GstrandBit problem\n";
+        errOut << "SOLUTION: please contact STAR author at https://groups.google.com/forum/#!forum/rna-star\n";
+        exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_GENOME_FILES, *P);
+    };
+    
+    uint N2bit= 1LLU << (SA.wordLength-1);
+    uint strandMask=~N2bit;    
+    for (uint64 isa=0;isa<SA.length; isa++)
+    {
+        uint64 ind1=SA[isa];
+        if ( (ind1 & N2bit)>0 ) 
+        {//- strand
+            if ( (ind1 & strandMask)>=nG2 )
+            {//the first nG bases
+                ind1+=nG1; //reverse complementary indices are all shifted by the length of the sequence
+                SA.writePacked(isa,ind1);
+            };
+        } else
+        {//+ strand
+            if ( ind1>=nG )
+            {//the last nG2 bases
+                ind1+=nG1; //reverse complementary indices are all shifted by the length of the sequence
+                SA.writePacked(isa,ind1);
+            };
+        };
+    };
+    
+    char** seq1=new char*[2];
+    
+    #define GENOME_endFillL 16    
+    char* seqq=new char [4*nG1+3*GENOME_endFillL];//ends shouldbe filled with 5 to mark boundaries
+            
+    seq1[0]=seqq+GENOME_endFillL;//TODO: avoid defining an extra array, use reverse search
+    seq1[1]=seqq+2*GENOME_endFillL+2*nG1;
+    
+    memset(seqq,GENOME_spacingChar,GENOME_endFillL);
+    memset(seqq+2*nG1+GENOME_endFillL,GENOME_spacingChar,GENOME_endFillL);
+    memset(seqq+4*nG1+2*GENOME_endFillL,GENOME_spacingChar,GENOME_endFillL);
+    
+    memcpy(seq1[0], G1, nG1);
+    for (uint ii=0; ii<nG1; ii++) 
+    {//reverse complement sequence
+        seq1[0][2*nG1-1-ii]=seq1[0][ii]<4 ? 3-seq1[0][ii] : seq1[0][ii];
+    };    
+    complementSeqNumbers(seq1[0], seq1[1], 2*nG1);//complement
+
+    uint64* indArray=new uint64[nG1*2*2+2];// for each base, 1st number - insertion place in SA, 2nd number - index, *2 for reverse compl
+
+
+    #pragma omp parallel num_threads(P->runThreadN)
+    #pragma omp for schedule (dynamic,1000)
+    for (uint ii=0; ii<2*nG1; ii++) {//find insertion points for each of the sequences
+
+        if (seq1[0][ii]>3)
+        {//no index for suffices starting with N
+            indArray[ii*2]=-1;
+        } else
+        {
+            indArray[ii*2] =  suffixArraySearch1(seq1, ii, 10000, G, nG, SA, (ii<nG1 ? true:false), 0, SA.length-1, 0, P) ;
+            indArray[ii*2+1] = ii;
+        };
+    };
+    
+    uint64 nInd=0;//true number of new indices
+    for (uint ii=0; ii<2*nG1; ii++) {//remove entries that cannot be inserted, this cannot be done in the parallel cycle above
+        if (indArray[ii*2]!= (uint) -1) {
+            indArray[nInd*2]=indArray[ii*2];
+            indArray[nInd*2+1]=indArray[ii*2+1];
+            ++nInd;
+        };
+    };
+    
+    time_t rawtime;
+    time ( &rawtime );
+    P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished SA search, number of new SA indices = "<<nInd<<endl;
+
+    globalGenomeArray=seq1[0];
+    qsort((void*) indArray, nInd, 2*sizeof(uint64), funCompareUintAndSuffixes);
+    time ( &rawtime );
+    P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished sorting SA indices"<<endl;
+
+    indArray[2*nInd]=-999; //mark the last junction
+    indArray[2*nInd+1]=-999; //mark the last junction
+
+    SA1.defineBits(SA.wordLength,SA.length+nInd);
+    
+    /*testing
+    PackedArray SAo;
+    SAo.defineBits(P->GstrandBit+1,P->nSA+nInd);
+    SAo.allocateArray();
+    ifstream oldSAin("./DirTrue/SA");
+    oldSAin.read(SAo.charArray,SAo.lengthByte);
+    oldSAin.close();
+    */
+    
+    uint isa1=0, isa2=0;
+    for (uint isa=0;isa<SA.length;isa++) {
+        while (isa==indArray[isa1*2]) {//insert new index before the existing index
+            uint ind1=indArray[isa1*2+1];
+            if (ind1<nG1) {
+                ind1+=nG;
+            } else {//reverse strand
+                ind1=(ind1-nG1+nG2) | N2bit;
+            };
+            SA1.writePacked(isa2,ind1);
+            /*testing
+            if (SA1[isa2]!=SAo[isa2]) {
+               cout <<isa2 <<" "<< SA1[isa2]<<" "<<SAo[isa2]<<endl;
+               //sleep(100);
+            };
+            */              
+            ++isa2; ++isa1;
+               
+        };        
+
+        SA1.writePacked(isa2,SA[isa]); //TODO make sure that the first sj index is not before the first array index
+            /*testing
+            if (SA1[isa2]!=SAo[isa2]) {
+               cout <<isa2 <<" "<< SA1[isa2]<<" "<<SAo[isa2]<<endl;
+               //sleep(100);
+            };
+            */           
+        ++isa2;
+    };
+    for (;isa1<nInd;isa1++)
+    {//insert the last indices
+        uint ind1=indArray[isa1*2+1];
+        if (ind1<nG1)
+        {
+            ind1+=nG;
+        } else 
+        {//reverse strand
+            ind1=(ind1-nG1+nG2) | N2bit;
+        };
+        SA1.writePacked(isa2,ind1);
+        ++isa2;
+    };
+        
+    time ( &rawtime );
+    P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished inserting SA indices" <<endl;   
+    
+//     //SAi insertions
+//     for (uint iL=0; iL < P->genomeSAindexNbases; iL++) {
+//         uint iSeq=0;
+//         uint ind0=P->genomeSAindexStart[iL]-1;//last index that was present in the old genome
+//         for (uint ii=P->genomeSAindexStart[iL];ii<P->genomeSAindexStart[iL+1]; ii++) {//scan through the longest index
+//             if (ii==798466)
+//                 cout <<ii;
+//             
+//             uint iSA1=SAi[ii];
+//             uint iSA2=iSA1 & P->SAiMarkNmask & P->SAiMarkAbsentMask;
+//             
+//             if ( iSeq<nInd && (iSA1 &  P->SAiMarkAbsentMaskC)>0 ) 
+//             {//index missing from the old genome
+//                 uint iSeq1=iSeq;
+//                 int64 ind1=funCalcSAi(seq1[0]+indArray[2*iSeq+1],iL);
+//                 while (ind1 < (int64)(ii-P->genomeSAindexStart[iL]) && indArray[2*iSeq]<iSA2) {
+//                     ++iSeq;
+//                     ind1=funCalcSAi(seq1[0]+indArray[2*iSeq+1],iL);
+//                 };
+//                 if (ind1 == (int64)(ii-P->genomeSAindexStart[iL]) ) {
+//                     SAi.writePacked(ii,indArray[2*iSeq]+iSeq+1);
+//                     for (uint ii0=ind0+1; ii0<ii; ii0++) {//fill all the absent indices with this value
+//                         SAi.writePacked(ii0,(indArray[2*iSeq]+iSeq+1) | P->SAiMarkAbsentMaskC);
+//                     };
+//                     ++iSeq;
+//                     ind0=ii;
+//                 } else {
+//                     iSeq=iSeq1;
+//                 };
+//             } else 
+//             {//index was present in the old genome
+//                 while (iSeq<nInd && indArray[2*iSeq]+1<iSA2) {//for this index insert "smaller" junctions
+//                     ++iSeq;
+//                 };
+//                 
+//                 while (iSeq<nInd && indArray[2*iSeq]+1==iSA2) {//special case, the index falls right behind SAi
+//                     if (funCalcSAi(seq1[0]+indArray[2*iSeq+1],iL) >= (int64) (ii-P->genomeSAindexStart[iL]) ) {//this belongs to the next index
+//                         break;
+//                     };
+//                     ++iSeq;
+//                 };   
+//                 
+//                 SAi.writePacked(ii,iSA1+iSeq);
+//                 
+//                 for (uint ii0=ind0+1; ii0<ii; ii0++) {//fill all the absent indices with this value
+//                     SAi.writePacked(ii0,(iSA2+iSeq) | P->SAiMarkAbsentMaskC);
+//                 };
+//                 ind0=ii;
+//             };
+//         };
+// 
+//     };
+// //     time ( &rawtime );    cout << timeMonthDayTime(rawtime) << "SAi first" <<endl;
+// 
+//     for (uint isj=0;isj<nInd;isj++) {
+//         int64 ind1=0;
+//         for (uint iL=0; iL < P->genomeSAindexNbases; iL++) {
+//             uint g=(uint) seq1[0][indArray[2*isj+1]+iL];
+//             ind1 <<= 2;
+//             if (g>3) {//this iSA contains N, need to mark the previous
+//                 for (uint iL1=iL; iL1 < P->genomeSAindexNbases; iL1++) {
+//                     ind1+=3;
+//                     int64 ind2=P->genomeSAindexStart[iL1]+ind1;
+//                     for (; ind2>=0; ind2--) {//find previous index that is not absent
+//                         if ( (SAi[ind2] & P->SAiMarkAbsentMaskC)==0 ) {
+//                             break;
+//                         };
+//                     };
+//                     SAi.writePacked(ind2,SAi[ind2] | P->SAiMarkNmaskC);
+//                     ind1 <<= 2;
+//                 };
+//                 break;
+//             } else {
+//                 ind1 += g;
+//             };
+//         };
+//     };
+//     time ( &rawtime );
+//     P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished SAi" <<endl;
+// 
+//     /* testing
+//     PackedArray SAio=SAi;
+//     SAio.allocateArray();
+//     ifstream oldSAiin("./DirTrue/SAindex");
+//     oldSAiin.read(SAio.charArray,8*(P->genomeSAindexNbases+2));//skip first bytes
+//     oldSAiin.read(SAio.charArray,SAio.lengthByte);
+//     oldSAiin.close();  
+// 
+//     for (uint iL=0; iL < P->genomeSAindexNbases; iL++) {
+//         for (uint ii=P->genomeSAindexStart[iL];ii<P->genomeSAindexStart[iL+1]; ii++) {//scan through the longets index
+//                 if ( SAio[ii]!=SAi[ii] ) {
+//                     cout <<iL<<" "<<ii<<" "<<SAio[ii]<<" "<<SAi[ii]<<endl;
+//                 };
+//         };
+//     };    
+//     */    
+    
+    //change parameters, most parameters are already re-defined in sjdbPrepare.cpp
+    SA.defineBits(P->GstrandBit+1,SA.length+nInd);//same as SA2
+    SA.pointArray(SA1.charArray);
+    P->nSA=SA.length;
+    P->nSAbyte=SA.lengthByte;
+    
+    //generate SAi
+    genomeSAindex(G,SA,P,SAi);
+    
+    time ( &rawtime );
+    P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished SAi" <<endl;
+
+    
+//     P->sjGstart=P->chrStart[P->nChrReal];
+//     memcpy(G+P->chrStart[P->nChrReal],seq1[0], nseq1[0]);
+    
+    
+    return nInd;
+};
diff --git a/source/insertSeqSA.h b/source/insertSeqSA.h
new file mode 100644
index 0000000..366c553
--- /dev/null
+++ b/source/insertSeqSA.h
@@ -0,0 +1,10 @@
+#ifndef CODE_insertSeqSA
+#define CODE_insertSeqSA
+
+#include "IncludeDefine.h"
+#include "PackedArray.h"
+#include "Parameters.h"
+
+uint insertSeqSA(PackedArray & SA, PackedArray & SA1, PackedArray & SAi, char * G, char * G1, uint64 nG, uint64 nG1, uint64 nG2, Parameters * P);
+
+#endif
diff --git a/source/loadGTF.cpp b/source/loadGTF.cpp
index a40cfe4..5428205 100644
--- a/source/loadGTF.cpp
+++ b/source/loadGTF.cpp
@@ -67,9 +67,14 @@ uint loadGTF(SjdbClass &sjdbLoci, Parameters *P, string dirOut) {//load gtf file
         
         if (exonN==0)
         {
-            P->inOut->logMain << "WARNING: found no exons in sjdbGTFfile=" << P->sjdbGTFfile <<endl;
-            return 0;
+            ostringstream errOut;
+            errOut << "Fatal INPUT FILE error, no ""exon"" lines in the GTF file: " << P->sjdbGTFfile <<"\n";
+            errOut << "Solution: check the formatting of the GTF file, it must contain some lines woth ""exon"" in the 3rd column.\n";
+            errOut << "          Make sure the GTF file is unzipped.\n";
+            errOut << "          If exons are marked with a different word, use --sjdbGTFfeatureExon .\n";
+            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
         };
+        
         uint* exonLoci=new uint [exonN*GTF_exonLoci_size];
         char* transcriptStrand = new char [exonN];
         vector <string> transcriptID, geneID;
@@ -150,6 +155,13 @@ uint loadGTF(SjdbClass &sjdbLoci, Parameters *P, string dirOut) {//load gtf file
             };//if (chr1.substr(0,1)!="#" && featureType=="exon")
         };//
         
+        if (exonN==0)
+        {
+            ostringstream errOut;
+            errOut << "Fatal INPUT FILE error, no valid ""exon"" lines in the GTF file: " << P->sjdbGTFfile <<"\n";
+            errOut << "Solution: check the formatting of the GTF file. Most likely cause is the difference in chromosome naming between GTF and FASTA file.\n";
+            exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_INPUT_FILES, *P);
+        };        
         //sort exonLoci by transcript ID and exon coordinates
         qsort((void*) exonLoci, exonN, sizeof(uint)*GTF_exonLoci_size, funCompareUint2);
 
@@ -167,8 +179,7 @@ uint loadGTF(SjdbClass &sjdbLoci, Parameters *P, string dirOut) {//load gtf file
 
             qsort((void*) exgeLoci, exonN, sizeof(uint)*GTF_exgeLoci_size, funCompareArrays<uint,5>);
 
-            ofstream exgeOut;
-            ofstrOpen(dirOut+"/exonGeTrInfo.tab","ERROR_00201",P,exgeOut);
+            ofstream & exgeOut = ofstrOpen(dirOut+"/exonGeTrInfo.tab",ERROR_OUT,P);
             exgeOut<<exonN<<"\n";
             for (uint iex=0; iex<exonN; iex++) {
                  exgeOut<<exgeLoci[GTF_exgeExStart(iex)] <<"\t"<<  exgeLoci[GTF_exgeExEnd(iex)] <<"\t"<< exgeLoci[GTF_exgeExStrand(iex)] \
@@ -176,8 +187,7 @@ uint loadGTF(SjdbClass &sjdbLoci, Parameters *P, string dirOut) {//load gtf file
             };
             exgeOut.close();
 
-            ofstream geOut;
-            ofstrOpen(dirOut+"/geneInfo.tab","ERROR_00202",P,geOut);
+            ofstream & geOut = ofstrOpen(dirOut+"/geneInfo.tab",ERROR_OUT,P);
             geOut << geneID.size() << "\n";
             for (uint ig=0; ig<geneID.size(); ig++) {//just geneID for now
                 geOut << geneID.at(ig) <<"\n";
diff --git a/source/parametersDefault b/source/parametersDefault
index a923381..edd51cd 100644
--- a/source/parametersDefault
+++ b/source/parametersDefault
@@ -29,6 +29,8 @@ runDirPerm                      User_RWX
                                 User_RWX ... user-read/write/execute
                                 All_RWX  ... all-read/write/execute (same as chmod 777)
 
+runRNGseed                      777
+    int: random number generator seed.
 
 ### Genome Parameters
 
@@ -79,8 +81,8 @@ sjdbGTFtagExonParentGene                gene_id
     string: tag name to be used as exons' gene-parents (default "gene_id" works for GTF files)
 
 sjdbOverhang                            100
-    int>=0: length of the donor/acceptor sequence on each side of the junctions, ideally = (mate_length - 1)
-            if =0, splice junction database is not used
+    int>0: length of the donor/acceptor sequence on each side of the junctions, ideally = (mate_length - 1)
+
 sjdbScore                               2
     int: extra alignment score for alignmets that cross database junctions
 
@@ -109,6 +111,9 @@ readMapNumber               -1
 readMatesLengthsIn          NotEqual
     string: Equal/NotEqual - lengths of names,sequences,qualities for both mates are the same  / not the same. NotEqual is safe in all situations.
 
+readNameSeparator           /
+    string(s): character(s) separating the part of the read names that will be trimmed in output (read name after space is always trimmed)
+
 clip3pNbases                 0
     int(s): number(s) of bases to clip from 3p of each mate. If one value is given, it will be assumed the same for both mates.
 
@@ -173,6 +178,10 @@ outReadsUnmapped                None
 outQSconversionAdd              0
    int: add this number to the quality score (e.g. to convert from Illumina to Sanger, use -31)
 
+outMultimapperOrder             Old_2.4
+    string: order of multimapping alignments in the output files
+                                Old_2.4             ... quasi-random order used before 2.5.0
+                                Random              ... random order of alignments for each multi-mapper. Read mates (pairs) are always adjacent, all alignment for each read stay together. This option will become default in the future releases.
 
 ### Output: SAM and BAM
 outSAMtype                      SAM
@@ -203,6 +212,9 @@ outSAMattributes                Standard
                                 All        ... NH HI AS nM NM MD jM jI
                                 None       ... no attributes
 
+outSAMattrIHstart               1
+    int>=0:                     start value for the IH attribute. 0 may be required by some downstream software, such as Cufflinks or StringTie.
+
 outSAMunmapped                  None
     string: output of unmapped reads in the SAM format
                                 None   ... no output
@@ -247,6 +259,14 @@ outSAMheaderPG          -
 outSAMheaderCommentFile -
     string: path to the file with @CO (comment) lines of the SAM header
 
+outSAMfilter            None
+    string(s): filter the output into main SAM/BAM files
+                        KeepOnlyAddedReferences ... only keep the reads for which all alignments are to the extra reference sequences added with --genomeFastaFiles at the mapping stage.
+
+outSAMmultNmax          -1
+    int: max number of multiple alignments for a read that will be output to the SAM/BAM files.
+                        -1 ... all alignments (up to --outFilterMultimapNmax) will be output
+
 outBAMcompression       1
     int: -1 to 10  BAM compression level, -1=default compression (6?), 0=no compression, 10=maximum compression
 
@@ -360,16 +380,16 @@ outSJfilterIntronMaxVsReadN        50000 100000 200000
 
 ### Scoring
 scoreGap                     0
-    gap open penalty
+    int: splice junction penalty (independent on intron motif)
 
 scoreGapNoncan               -8
-    non-canonical gap open penalty (in addition to scoreGap)
+    int: non-canonical junction penalty (in addition to scoreGap)
 
 scoreGapGCAG                 -4
-    GC/AG and CT/GC gap open penalty (in addition to scoreGap)
+    GC/AG and CT/GC junction penalty (in addition to scoreGap)
 
 scoreGapATAC                 -8
-    AT/AC  and GT/AT gap open penalty  (in addition to scoreGap)
+    AT/AC  and GT/AT junction penalty  (in addition to scoreGap)
 
 scoreGenomicLengthLog2scale   -0.25
     extra score logarithmically scaled with genomic length of the alignment: scoreGenomicLengthLog2scale*log2(genomicLength)
@@ -425,6 +445,10 @@ alignMatesGapMax            0
 alignSJoverhangMin          5
     int>0: minimum overhang (i.e. block size) for spliced alignments
 
+alignSJstitchMismatchNmax   0 -1 0 0
+    4*int>=0: maximum number of mismatches for stitching of the splice junctions (-1: no limit). 
+                            (1) non-canonical motifs, (2) GT/AG and CT/AC motif, (3) GC/AG and CT/GC motif, (4) AT/AC and GT/AT motif.
+
 alignSJDBoverhangMin        3
     int>0: minimum overhang (i.e. block size) for annotated (sjdb) spliced alignments
 
@@ -494,6 +518,14 @@ chimScoreJunctionNonGTAG    -1
 chimJunctionOverhangMin     20
     int>=0: minimum overhang for a chimeric junction
 
+chimSegmentReadGapMax       0
+    int>=0: maximum gap in the read sequence between chimeric segments
+
+chimFilter                  banGenomicN
+    string(s): different filters for chimeric alignments
+                            None ... no filtering
+                            banGenomicN ... Ns are not allowed in the genome sequence around the chimeric junction
+
 ### Quantification of Annotations
 quantMode                   -
     string(s): types of quantification requested
diff --git a/source/parametersDefault.xxd b/source/parametersDefault.xxd
new file mode 100644
index 0000000..6039c11
--- /dev/null
+++ b/source/parametersDefault.xxd
@@ -0,0 +1,2305 @@
+unsigned char parametersDefault[] = {
+  0x23, 0x23, 0x23, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73,
+  0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x54, 0x41, 0x52,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x30, 0x32, 0x30, 0x32, 0x30, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x53, 0x54, 0x41, 0x52, 0x20,
+  0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x65,
+  0x72, 0x69, 0x63, 0x20, 0x49, 0x44, 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61,
+  0x73, 0x65, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x68,
+  0x61, 0x6e, 0x67, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61,
+  0x6c, 0x75, 0x65, 0x21, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
+  0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x32, 0x30, 0x31, 0x30, 0x31, 0x20,
+  0x30, 0x32, 0x30, 0x32, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74,
+  0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x76, 0x65, 0x72,
+  0x73, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69,
+  0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x69,
+  0x73, 0x20, 0x53, 0x54, 0x41, 0x52, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61,
+  0x73, 0x65, 0x2e, 0x20, 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x64,
+  0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65,
+  0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x21,
+  0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65,
+  0x74, 0x65, 0x72, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x0a, 0x70, 0x61,
+  0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x46, 0x69, 0x6c, 0x65,
+  0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a,
+  0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x75,
+  0x73, 0x65, 0x72, 0x2d, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20,
+  0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x66,
+  0x69, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x2d, 0x22, 0x3a, 0x20, 0x6e, 0x6f,
+  0x6e, 0x65, 0x2e, 0x20, 0x43, 0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
+  0x20, 0x62, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20,
+  0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61,
+  0x6e, 0x64, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x0a, 0x0a, 0x23, 0x23,
+  0x23, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x0a, 0x73, 0x79, 0x73,
+  0x53, 0x68, 0x65, 0x6c, 0x6c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73,
+  0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20,
+  0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x68, 0x65, 0x6c, 0x6c,
+  0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x2c, 0x20, 0x70, 0x72, 0x65,
+  0x66, 0x65, 0x72, 0x72, 0x61, 0x62, 0x6c, 0x79, 0x20, 0x62, 0x61, 0x73,
+  0x68, 0x2c, 0x20, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x2f, 0x62, 0x69, 0x6e,
+  0x2f, 0x62, 0x61, 0x73, 0x68, 0x2e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x73, 0x68,
+  0x65, 0x6c, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75,
+  0x74, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x69, 0x63, 0x61, 0x6c,
+  0x6c, 0x79, 0x20, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x73, 0x68, 0x2e, 0x20,
+  0x54, 0x68, 0x69, 0x73, 0x20, 0x77, 0x61, 0x73, 0x20, 0x72, 0x65, 0x70,
+  0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x61, 0x69,
+  0x6c, 0x20, 0x6f, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x55, 0x62,
+  0x75, 0x6e, 0x74, 0x75, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73,
+  0x20, 0x2d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x20,
+  0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63,
+  0x69, 0x66, 0x79, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20,
+  0x62, 0x61, 0x73, 0x68, 0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x52,
+  0x75, 0x6e, 0x20, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72,
+  0x73, 0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61,
+  0x6c, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x73, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x74, 0x79,
+  0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x75,
+  0x6e, 0x3a, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x61, 0x64,
+  0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6d, 0x61, 0x70, 0x20, 0x72, 0x65,
+  0x61, 0x64, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61,
+  0x74, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e,
+  0x2e, 0x2e, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20,
+  0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x70,
+  0x75, 0x74, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+  0x46, 0x72, 0x6f, 0x6d, 0x42, 0x41, 0x4d, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
+  0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d,
+  0x65, 0x6e, 0x74, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x42, 0x41,
+  0x4d, 0x2e, 0x20, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x6c, 0x79,
+  0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20,
+  0x77, 0x69, 0x74, 0x68, 0x20, 0x2d, 0x2d, 0x6f, 0x75, 0x74, 0x57, 0x69,
+  0x67, 0x54, 0x79, 0x70, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x2d, 0x2d,
+  0x62, 0x61, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x75, 0x70,
+  0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x72, 0x75,
+  0x6e, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x4e, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x3a, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x74,
+  0x6f, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x53, 0x54, 0x41, 0x52, 0x0a, 0x0a,
+  0x72, 0x75, 0x6e, 0x44, 0x69, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x55, 0x73, 0x65, 0x72,
+  0x5f, 0x52, 0x57, 0x58, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72,
+  0x69, 0x6e, 0x67, 0x3a, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73,
+  0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73,
+  0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x2d, 0x74, 0x69, 0x6d, 0x65,
+  0x2e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x55,
+  0x73, 0x65, 0x72, 0x5f, 0x52, 0x57, 0x58, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
+  0x75, 0x73, 0x65, 0x72, 0x2d, 0x72, 0x65, 0x61, 0x64, 0x2f, 0x77, 0x72,
+  0x69, 0x74, 0x65, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x6c, 0x6c, 0x5f,
+  0x52, 0x57, 0x58, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x6c,
+  0x2d, 0x72, 0x65, 0x61, 0x64, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2f,
+  0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x28, 0x73, 0x61, 0x6d,
+  0x65, 0x20, 0x61, 0x73, 0x20, 0x63, 0x68, 0x6d, 0x6f, 0x64, 0x20, 0x37,
+  0x37, 0x37, 0x29, 0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x52, 0x4e, 0x47, 0x73,
+  0x65, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x37, 0x37, 0x37, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
+  0x3a, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x20, 0x6e, 0x75, 0x6d,
+  0x62, 0x65, 0x72, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x6f,
+  0x72, 0x20, 0x73, 0x65, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x23,
+  0x20, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x50, 0x61, 0x72, 0x61,
+  0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x6f,
+  0x6d, 0x65, 0x44, 0x69, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x2e, 0x2f, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x44, 0x69, 0x72, 0x2f,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a,
+  0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x77,
+  0x68, 0x65, 0x72, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20,
+  0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x74,
+  0x6f, 0x72, 0x65, 0x64, 0x20, 0x28, 0x69, 0x66, 0x20, 0x72, 0x75, 0x6e,
+  0x4d, 0x6f, 0x64, 0x65, 0x21, 0x3d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61,
+  0x74, 0x65, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x29, 0x20, 0x6f, 0x72,
+  0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x67, 0x65, 0x6e,
+  0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x69, 0x66, 0x20, 0x72,
+  0x75, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x3d, 0x3d, 0x67, 0x65, 0x6e, 0x65,
+  0x72, 0x61, 0x74, 0x65, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x29, 0x0a,
+  0x0a, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x4e, 0x6f, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4d,
+  0x65, 0x6d, 0x6f, 0x72, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74,
+  0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x6f,
+  0x66, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x6d, 0x65, 0x6d,
+  0x6f, 0x72, 0x79, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x66, 0x6f,
+  0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65,
+  0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x61,
+  0x64, 0x41, 0x6e, 0x64, 0x4b, 0x65, 0x65, 0x70, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x67, 0x65,
+  0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x73, 0x68,
+  0x61, 0x72, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6b, 0x65, 0x65,
+  0x70, 0x20, 0x69, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x6d, 0x65, 0x6d, 0x6f,
+  0x72, 0x79, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x72, 0x75, 0x6e,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x4c, 0x6f, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x52, 0x65,
+  0x6d, 0x6f, 0x76, 0x65, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6c,
+  0x6f, 0x61, 0x64, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x69,
+  0x6e, 0x74, 0x6f, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x62,
+  0x75, 0x74, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x69, 0x74,
+  0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x72, 0x75, 0x6e, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x4c, 0x6f, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x45, 0x78, 0x69, 0x74,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6c, 0x6f, 0x61,
+  0x64, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x74,
+  0x6f, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x6d, 0x65, 0x6d,
+  0x6f, 0x72, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x69, 0x74,
+  0x2c, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20,
+  0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66,
+  0x75, 0x74, 0x75, 0x72, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x73, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x64, 0x6f, 0x20,
+  0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x70, 0x20, 0x61, 0x6e, 0x79, 0x74,
+  0x68, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x72,
+  0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64,
+  0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d,
+  0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f,
+  0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79,
+  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74,
+  0x20, 0x75, 0x73, 0x65, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20,
+  0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x65, 0x61, 0x63, 0x68,
+  0x20, 0x6a, 0x6f, 0x62, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x68, 0x61,
+  0x76, 0x65, 0x20, 0x69, 0x74, 0x73, 0x20, 0x6f, 0x77, 0x6e, 0x20, 0x70,
+  0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d,
+  0x65, 0x0a, 0x0a, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x47, 0x65, 0x6e,
+  0x6f, 0x6d, 0x65, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72,
+  0x73, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x46, 0x61, 0x73,
+  0x74, 0x61, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a, 0x20,
+  0x70, 0x61, 0x74, 0x68, 0x28, 0x73, 0x29, 0x20, 0x74, 0x6f, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x66, 0x61, 0x73, 0x74, 0x61, 0x20, 0x66, 0x69, 0x6c,
+  0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x67, 0x65, 0x6e, 0x6f,
+  0x6d, 0x69, 0x63, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65,
+  0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65,
+  0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c,
+  0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62,
+  0x79, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x20, 0x4f, 0x6e,
+  0x6c, 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x66, 0x20, 0x72,
+  0x75, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x3d, 0x3d, 0x67, 0x65, 0x6e, 0x6f,
+  0x6d, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x2e, 0x20,
+  0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20,
+  0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x70, 0x6c,
+  0x61, 0x69, 0x6e, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x46, 0x41, 0x53,
+  0x54, 0x41, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x68,
+  0x65, 0x79, 0x20, 0x2a, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x2a, 0x20,
+  0x62, 0x65, 0x20, 0x7a, 0x69, 0x70, 0x70, 0x65, 0x64, 0x2e, 0x0a, 0x0a,
+  0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x43, 0x68, 0x72, 0x42, 0x69, 0x6e,
+  0x4e, 0x62, 0x69, 0x74, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x31, 0x38, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x6e, 0x74, 0x3a, 0x20, 0x3d, 0x6c, 0x6f, 0x67, 0x32, 0x28, 0x63, 0x68,
+  0x72, 0x42, 0x69, 0x6e, 0x29, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65,
+  0x20, 0x63, 0x68, 0x72, 0x42, 0x69, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x62, 0x69, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20,
+  0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x61,
+  0x67, 0x65, 0x3a, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x63, 0x68, 0x72,
+  0x6f, 0x6d, 0x6f, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c,
+  0x20, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x69,
+  0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65,
+  0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x6e, 0x73, 0x0a, 0x0a, 0x67,
+  0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x53, 0x41, 0x69, 0x6e, 0x64, 0x65, 0x78,
+  0x4e, 0x62, 0x61, 0x73, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x31, 0x34, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
+  0x74, 0x3a, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x28, 0x62,
+  0x61, 0x73, 0x65, 0x73, 0x29, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x53, 0x41, 0x20, 0x70, 0x72, 0x65, 0x2d, 0x69, 0x6e, 0x64, 0x65,
+  0x78, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e,
+  0x20, 0x54, 0x79, 0x70, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x62,
+  0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x31, 0x30, 0x20, 0x61, 0x6e,
+  0x64, 0x20, 0x31, 0x35, 0x2e, 0x20, 0x4c, 0x6f, 0x6e, 0x67, 0x65, 0x72,
+  0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x77, 0x69, 0x6c,
+  0x6c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6d, 0x75, 0x63, 0x68, 0x20, 0x6d,
+  0x6f, 0x72, 0x65, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20,
+  0x62, 0x75, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x66, 0x61,
+  0x73, 0x74, 0x65, 0x72, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65,
+  0x73, 0x2e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x53, 0x41,
+  0x73, 0x70, 0x61, 0x72, 0x73, 0x65, 0x44, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x73, 0x75, 0x66,
+  0x66, 0x75, 0x78, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x73, 0x70,
+  0x61, 0x72, 0x73, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x69, 0x2e, 0x65, 0x2e,
+  0x20, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x62, 0x65,
+  0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65,
+  0x73, 0x3a, 0x20, 0x75, 0x73, 0x65, 0x20, 0x62, 0x69, 0x67, 0x67, 0x65,
+  0x72, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6f,
+  0x20, 0x64, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x20, 0x6e, 0x65,
+  0x65, 0x64, 0x65, 0x64, 0x20, 0x52, 0x41, 0x4d, 0x20, 0x61, 0x74, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20,
+  0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x70, 0x65, 0x65,
+  0x64, 0x20, 0x72, 0x65, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a,
+  0x0a, 0x23, 0x23, 0x23, 0x20, 0x53, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x20,
+  0x4a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x44, 0x61,
+  0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x0a, 0x73, 0x6a, 0x64, 0x62, 0x46,
+  0x69, 0x6c, 0x65, 0x43, 0x68, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45,
+  0x6e, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28,
+  0x73, 0x29, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x77, 0x69,
+  0x74, 0x68, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x63,
+  0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x20, 0x28,
+  0x63, 0x68, 0x72, 0x20, 0x3c, 0x74, 0x61, 0x62, 0x3e, 0x20, 0x73, 0x74,
+  0x61, 0x72, 0x74, 0x20, 0x3c, 0x74, 0x61, 0x62, 0x3e, 0x20, 0x65, 0x6e,
+  0x64, 0x20, 0x3c, 0x74, 0x61, 0x62, 0x3e, 0x20, 0x73, 0x74, 0x72, 0x61,
+  0x6e, 0x64, 0x29, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x73, 0x2e,
+  0x20, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, 0x66, 0x69,
+  0x6c, 0x65, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x73,
+  0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x77, 0x61, 0x6e, 0x64,
+  0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6e,
+  0x63, 0x61, 0x74, 0x65, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x0a, 0x0a,
+  0x73, 0x6a, 0x64, 0x62, 0x47, 0x54, 0x46, 0x66, 0x69, 0x6c, 0x65, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74,
+  0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74,
+  0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x54, 0x46, 0x20, 0x66, 0x69,
+  0x6c, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x6e, 0x6f,
+  0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x73, 0x6a, 0x64,
+  0x62, 0x47, 0x54, 0x46, 0x63, 0x68, 0x72, 0x50, 0x72, 0x65, 0x66, 0x69,
+  0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
+  0x67, 0x3a, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x66, 0x6f,
+  0x72, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x6f, 0x73, 0x6f, 0x6d, 0x65,
+  0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20,
+  0x47, 0x54, 0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x65, 0x2e,
+  0x67, 0x2e, 0x20, 0x27, 0x63, 0x68, 0x72, 0x27, 0x20, 0x66, 0x6f, 0x72,
+  0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x45, 0x4e, 0x53, 0x4d, 0x45,
+  0x42, 0x4c, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f,
+  0x6e, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x55, 0x43, 0x53, 0x43,
+  0x20, 0x67, 0x65, 0x6e, 0x65, 0x6f, 0x6d, 0x65, 0x73, 0x29, 0x0a, 0x0a,
+  0x73, 0x6a, 0x64, 0x62, 0x47, 0x54, 0x46, 0x66, 0x65, 0x61, 0x74, 0x75,
+  0x72, 0x65, 0x45, 0x78, 0x6f, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x66, 0x65, 0x61,
+  0x74, 0x75, 0x72, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x69, 0x6e,
+  0x20, 0x47, 0x54, 0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x6f,
+  0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20,
+  0x65, 0x78, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x75,
+  0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73,
+  0x63, 0x72, 0x69, 0x70, 0x74, 0x73, 0x0a, 0x0a, 0x73, 0x6a, 0x64, 0x62,
+  0x47, 0x54, 0x46, 0x74, 0x61, 0x67, 0x45, 0x78, 0x6f, 0x6e, 0x50, 0x61,
+  0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69,
+  0x70, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x69,
+  0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
+  0x3a, 0x20, 0x74, 0x61, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74,
+  0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x73,
+  0x20, 0x65, 0x78, 0x6f, 0x6e, 0x73, 0x27, 0x20, 0x74, 0x72, 0x61, 0x6e,
+  0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2d, 0x70, 0x61, 0x72, 0x65, 0x6e,
+  0x74, 0x73, 0x20, 0x28, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20,
+  0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f,
+  0x69, 0x64, 0x22, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x66, 0x6f,
+  0x72, 0x20, 0x47, 0x54, 0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x29,
+  0x0a, 0x0a, 0x73, 0x6a, 0x64, 0x62, 0x47, 0x54, 0x46, 0x74, 0x61, 0x67,
+  0x45, 0x78, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x47, 0x65,
+  0x6e, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x5f, 0x69,
+  0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
+  0x3a, 0x20, 0x74, 0x61, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74,
+  0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x73,
+  0x20, 0x65, 0x78, 0x6f, 0x6e, 0x73, 0x27, 0x20, 0x67, 0x65, 0x6e, 0x65,
+  0x2d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x28, 0x64, 0x65,
+  0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x22, 0x67, 0x65, 0x6e, 0x65, 0x5f,
+  0x69, 0x64, 0x22, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x66, 0x6f,
+  0x72, 0x20, 0x47, 0x54, 0x46, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x29,
+  0x0a, 0x0a, 0x73, 0x6a, 0x64, 0x62, 0x4f, 0x76, 0x65, 0x72, 0x68, 0x61,
+  0x6e, 0x67, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x30, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6c, 0x65, 0x6e,
+  0x67, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64,
+  0x6f, 0x6e, 0x6f, 0x72, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x6f,
+  0x72, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f,
+  0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x73, 0x69, 0x64, 0x65, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x69, 0x64, 0x65, 0x61, 0x6c, 0x6c,
+  0x79, 0x20, 0x3d, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x65,
+  0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, 0x0a, 0x73,
+  0x6a, 0x64, 0x62, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
+  0x3a, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x61, 0x6c, 0x69, 0x67,
+  0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x20,
+  0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x74,
+  0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73,
+  0x20, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x6a, 0x75,
+  0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x73, 0x6a, 0x64,
+  0x62, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x42, 0x61, 0x73, 0x69, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73,
+  0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68,
+  0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x61,
+  0x76, 0x65, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x73, 0x6a, 0x64, 0x62,
+  0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61,
+  0x72, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x20,
+  0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6c, 0x79, 0x20, 0x61,
+  0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e,
+  0x67, 0x20, 0x73, 0x74, 0x65, 0x70, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09,
+  0x42, 0x61, 0x73, 0x69, 0x63, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x6e,
+  0x6c, 0x79, 0x20, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x20, 0x6a, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2f, 0x20, 0x74, 0x72, 0x61, 0x6e,
+  0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73,
+  0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x41, 0x6c, 0x6c, 0x20, 0x20, 0x20,
+  0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65,
+  0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20,
+  0x62, 0x69, 0x67, 0x20, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x2c, 0x20,
+  0x53, 0x41, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x41, 0x69, 0x6e, 0x64,
+  0x65, 0x78, 0x20, 0x2d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x77, 0x69,
+  0x6c, 0x6c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20,
+  0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x67, 0x65, 0x6e,
+  0x6f, 0x6d, 0x65, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72,
+  0x79, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x49, 0x6e, 0x70, 0x75, 0x74,
+  0x20, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74,
+  0x42, 0x41, 0x4d, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a,
+  0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x42, 0x41, 0x4d,
+  0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c,
+  0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20,
+  0x77, 0x69, 0x74, 0x68, 0x20, 0x2d, 0x2d, 0x72, 0x75, 0x6e, 0x4d, 0x6f,
+  0x64, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x41, 0x6c, 0x69, 0x67,
+  0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x41,
+  0x4d, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20,
+  0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x0a, 0x0a,
+  0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x49, 0x6e, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x61, 0x64, 0x31, 0x20, 0x52, 0x65,
+  0x61, 0x64, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69,
+  0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x73,
+  0x20, 0x74, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68,
+  0x61, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x69,
+  0x6e, 0x70, 0x75, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x31, 0x20, 0x28,
+  0x61, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x65, 0x65, 0x64,
+  0x65, 0x64, 0x2c, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64, 0x32, 0x29, 0x0a,
+  0x0a, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x43, 0x6f,
+  0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x63,
+  0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20,
+  0x74, 0x6f, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x20, 0x66,
+  0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x66, 0x69, 0x6c,
+  0x65, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6d,
+  0x61, 0x6e, 0x64, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x67,
+  0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x46, 0x41, 0x53, 0x54,
+  0x41, 0x20, 0x6f, 0x72, 0x20, 0x46, 0x41, 0x53, 0x54, 0x51, 0x20, 0x74,
+  0x65, 0x78, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x6e, 0x64,
+  0x20, 0x69, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x64, 0x6f, 0x75,
+  0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61,
+  0x6d, 0x70, 0x6c, 0x65, 0x3a, 0x20, 0x7a, 0x63, 0x61, 0x74, 0x20, 0x2d,
+  0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65,
+  0x73, 0x73, 0x20, 0x2e, 0x67, 0x7a, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73,
+  0x2c, 0x20, 0x62, 0x7a, 0x63, 0x61, 0x74, 0x20, 0x2d, 0x20, 0x74, 0x6f,
+  0x20, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20,
+  0x2e, 0x62, 0x7a, 0x32, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2c, 0x20,
+  0x65, 0x74, 0x63, 0x2e, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61,
+  0x70, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x31,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x6e, 0x75,
+  0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64,
+  0x73, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x70, 0x20, 0x66, 0x72, 0x6f,
+  0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x6e,
+  0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66,
+  0x69, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x31, 0x3a, 0x20,
+  0x6d, 0x61, 0x70, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64,
+  0x73, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x61, 0x74, 0x65, 0x73,
+  0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x73, 0x49, 0x6e, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x74, 0x45, 0x71,
+  0x75, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69,
+  0x6e, 0x67, 0x3a, 0x20, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x2f, 0x4e, 0x6f,
+  0x74, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x20, 0x2d, 0x20, 0x6c, 0x65, 0x6e,
+  0x67, 0x74, 0x68, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+  0x73, 0x2c, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x2c,
+  0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x20, 0x66, 0x6f,
+  0x72, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73,
+  0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d,
+  0x65, 0x20, 0x20, 0x2f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x73, 0x61, 0x6d, 0x65, 0x2e, 0x20, 0x4e, 0x6f, 0x74, 0x45, 0x71,
+  0x75, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x73, 0x61, 0x66, 0x65, 0x20,
+  0x69, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x69, 0x74, 0x75, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x0a, 0x0a, 0x72, 0x65, 0x61, 0x64,
+  0x4e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f,
+  0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x2f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
+  0x28, 0x73, 0x29, 0x3a, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74,
+  0x65, 0x72, 0x28, 0x73, 0x29, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61,
+  0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72,
+  0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61,
+  0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74,
+  0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x74, 0x72, 0x69,
+  0x6d, 0x6d, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x70,
+  0x75, 0x74, 0x20, 0x28, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6e, 0x61, 0x6d,
+  0x65, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x73, 0x70, 0x61, 0x63,
+  0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20,
+  0x74, 0x72, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x29, 0x0a, 0x0a, 0x63, 0x6c,
+  0x69, 0x70, 0x33, 0x70, 0x4e, 0x62, 0x61, 0x73, 0x65, 0x73, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
+  0x28, 0x73, 0x29, 0x3a, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28,
+  0x73, 0x29, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x73, 0x20,
+  0x74, 0x6f, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x20, 0x66, 0x72, 0x6f, 0x6d,
+  0x20, 0x33, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20,
+  0x6d, 0x61, 0x74, 0x65, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6f, 0x6e, 0x65,
+  0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x67, 0x69,
+  0x76, 0x65, 0x6e, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c,
+  0x20, 0x62, 0x65, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72,
+  0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x2e,
+  0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x70, 0x35, 0x70, 0x4e, 0x62, 0x61, 0x73,
+  0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x69, 0x6e, 0x74, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x6e, 0x75, 0x6d,
+  0x62, 0x65, 0x72, 0x28, 0x73, 0x29, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x61,
+  0x73, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x20,
+  0x66, 0x72, 0x6f, 0x6d, 0x20, 0x35, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x65,
+  0x61, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x2e, 0x20, 0x49, 0x66,
+  0x20, 0x6f, 0x6e, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69,
+  0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x2c, 0x20, 0x69, 0x74, 0x20,
+  0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x73, 0x73, 0x75,
+  0x6d, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65,
+  0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x6d, 0x61,
+  0x74, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x70, 0x33, 0x70,
+  0x41, 0x64, 0x61, 0x70, 0x74, 0x65, 0x72, 0x53, 0x65, 0x71, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73,
+  0x29, 0x3a, 0x20, 0x61, 0x64, 0x61, 0x70, 0x74, 0x65, 0x72, 0x20, 0x73,
+  0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20,
+  0x63, 0x6c, 0x69, 0x70, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x33, 0x70,
+  0x20, 0x6f, 0x66, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x6d, 0x61, 0x74,
+  0x65, 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x76,
+  0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65,
+  0x6e, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62,
+  0x65, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62,
+  0x6f, 0x74, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x0a, 0x0a,
+  0x63, 0x6c, 0x69, 0x70, 0x33, 0x70, 0x41, 0x64, 0x61, 0x70, 0x74, 0x65,
+  0x72, 0x4d, 0x4d, 0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x30, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x6d,
+  0x61, 0x78, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f,
+  0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63,
+  0x68, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x33, 0x70, 0x20, 0x61,
+  0x64, 0x70, 0x61, 0x74, 0x65, 0x72, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x70,
+  0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68,
+  0x20, 0x6d, 0x61, 0x74, 0x65, 0x2e, 0x20, 0x20, 0x49, 0x66, 0x20, 0x6f,
+  0x6e, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x69, 0x73, 0x20,
+  0x67, 0x69, 0x76, 0x65, 0x6e, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69,
+  0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65,
+  0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x66,
+  0x6f, 0x72, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x6d, 0x61, 0x74, 0x65,
+  0x73, 0x2e, 0x0a, 0x0a, 0x63, 0x6c, 0x69, 0x70, 0x33, 0x70, 0x41, 0x66,
+  0x74, 0x65, 0x72, 0x41, 0x64, 0x61, 0x70, 0x74, 0x65, 0x72, 0x4e, 0x62,
+  0x61, 0x73, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x6e, 0x75,
+  0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65,
+  0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x20, 0x66, 0x72,
+  0x6f, 0x6d, 0x20, 0x33, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x61, 0x63,
+  0x68, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x61, 0x70, 0x74, 0x65, 0x72,
+  0x20, 0x63, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x49,
+  0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20,
+  0x69, 0x73, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x2c, 0x20, 0x69, 0x74,
+  0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x73, 0x73,
+  0x75, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d,
+  0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x6d,
+  0x61, 0x74, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20,
+  0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69,
+  0x74, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72,
+  0x61, 0x74, 0x65, 0x52, 0x41, 0x4d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x33, 0x31, 0x30,
+  0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x69,
+  0x6d, 0x75, 0x6d, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c,
+  0x65, 0x20, 0x52, 0x41, 0x4d, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73,
+  0x29, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65,
+  0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a,
+  0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x49, 0x4f, 0x62, 0x75, 0x66, 0x66,
+  0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x31, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d,
+  0x61, 0x78, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65,
+  0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x20, 0x73, 0x69, 0x7a,
+  0x65, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x29, 0x20, 0x66, 0x6f,
+  0x72, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x6f, 0x75, 0x74, 0x70,
+  0x75, 0x74, 0x2c, 0x20, 0x70, 0x65, 0x72, 0x20, 0x74, 0x68, 0x72, 0x65,
+  0x61, 0x64, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x4f, 0x75, 0x74,
+  0x53, 0x41, 0x4d, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x42, 0x79,
+  0x74, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d,
+  0x61, 0x78, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x72,
+  0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x72, 0x65,
+  0x61, 0x64, 0x2e, 0x20, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e,
+  0x64, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x20, 0x3e,
+  0x28, 0x32, 0x2a, 0x28, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4d, 0x61,
+  0x74, 0x65, 0x31, 0x2b, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4d, 0x61,
+  0x74, 0x65, 0x32, 0x2b, 0x31, 0x30, 0x30, 0x29, 0x2a, 0x6f, 0x75, 0x74,
+  0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x6d,
+  0x61, 0x70, 0x4e, 0x6d, 0x61, 0x78, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69,
+  0x74, 0x4f, 0x75, 0x74, 0x53, 0x4a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x61,
+  0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x30,
+  0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a,
+  0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20,
+  0x6f, 0x66, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+  0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x72, 0x65, 0x61,
+  0x64, 0x20, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67,
+  0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6d,
+  0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x29, 0x0a, 0x0a, 0x6c, 0x69, 0x6d,
+  0x69, 0x74, 0x4f, 0x75, 0x74, 0x53, 0x4a, 0x63, 0x6f, 0x6c, 0x6c, 0x61,
+  0x70, 0x73, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30,
+  0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
+  0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d,
+  0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x61,
+  0x70, 0x73, 0x65, 0x64, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x73, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x41, 0x4d,
+  0x73, 0x6f, 0x72, 0x74, 0x52, 0x41, 0x4d, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x61,
+  0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61,
+  0x62, 0x6c, 0x65, 0x20, 0x52, 0x41, 0x4d, 0x20, 0x66, 0x6f, 0x72, 0x20,
+  0x73, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x42, 0x41, 0x4d, 0x2e,
+  0x20, 0x49, 0x66, 0x20, 0x3d, 0x30, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x77,
+  0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x74,
+  0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65,
+  0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x2e,
+  0x20, 0x30, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x63, 0x61, 0x6e,
+  0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65,
+  0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x2d, 0x2d, 0x67, 0x65, 0x6e,
+  0x6f, 0x6d, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x4e, 0x6f, 0x53, 0x68,
+  0x61, 0x72, 0x65, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x6f,
+  0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x6c, 0x69, 0x6d, 0x69,
+  0x74, 0x53, 0x6a, 0x64, 0x62, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x4e,
+  0x73, 0x6a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31,
+  0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d,
+  0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66,
+  0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f,
+  0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64,
+  0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f,
+  0x6d, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6c,
+  0x79, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x70,
+  0x70, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x74, 0x61, 0x67, 0x65, 0x2c, 0x20,
+  0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68,
+  0x6f, 0x73, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x6e, 0x6e,
+  0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64,
+  0x20, 0x74, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63,
+  0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x31,
+  0x73, 0x74, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x32, 0x2d, 0x70, 0x61, 0x73, 0x73, 0x20, 0x72, 0x75,
+  0x6e, 0x0a, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x4f, 0x75, 0x74, 0x70,
+  0x75, 0x74, 0x3a, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x0a,
+  0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x50,
+  0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2f, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x6f,
+  0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20,
+  0x6e, 0x61, 0x6d, 0x65, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20,
+  0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x66,
+  0x75, 0x6c, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74,
+  0x69, 0x76, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0x29, 0x2e, 0x20, 0x43,
+  0x61, 0x6e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x20, 0x64,
+  0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x69,
+  0x6e, 0x65, 0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x54, 0x6d, 0x70, 0x44,
+  0x69, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
+  0x67, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x61,
+  0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x74,
+  0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20,
+  0x75, 0x73, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x74, 0x65, 0x6d, 0x70,
+  0x6f, 0x72, 0x61, 0x72, 0x79, 0x20, 0x62, 0x79, 0x20, 0x53, 0x54, 0x41,
+  0x52, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+  0x6e, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20,
+  0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x77, 0x69,
+  0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65,
+  0x64, 0x21, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x2d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x6d,
+  0x70, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x20,
+  0x77, 0x69, 0x6c, 0x6c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,
+  0x20, 0x74, 0x6f, 0x20, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x4e,
+  0x61, 0x6d, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x5f, 0x53, 0x54,
+  0x41, 0x52, 0x74, 0x6d, 0x70, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x74,
+  0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x4c, 0x6f, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73,
+  0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68,
+  0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c,
+  0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64,
+  0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x20, 0x28,
+  0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x6f, 0x75, 0x74,
+  0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f,
+  0x67, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x6c, 0x6f, 0x67, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+  0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x41,
+  0x4d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20,
+  0x69, 0x6e, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+  0x74, 0x20, 0x28, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6e, 0x6f, 0x72,
+  0x6d, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x75,
+  0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x41, 0x6c, 0x69, 0x67,
+  0x6e, 0x65, 0x64, 0x2e, 0x6f, 0x75, 0x74, 0x2e, 0x73, 0x61, 0x6d, 0x20,
+  0x66, 0x69, 0x6c, 0x65, 0x29, 0x2c, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61,
+  0x6c, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x6f,
+  0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x67,
+  0x6f, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x4c, 0x6f, 0x67, 0x2e, 0x73,
+  0x74, 0x64, 0x2e, 0x6f, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x42, 0x41, 0x4d, 0x5f, 0x55, 0x6e, 0x73, 0x6f, 0x72,
+  0x74, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d,
+  0x65, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x42, 0x41, 0x4d, 0x20,
+  0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x20, 0x75, 0x6e, 0x73, 0x6f,
+  0x72, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72,
+  0x65, 0x73, 0x20, 0x2d, 0x2d, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x74,
+  0x79, 0x70, 0x65, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x55, 0x6e, 0x73, 0x6f,
+  0x72, 0x74, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x42, 0x41, 0x4d, 0x5f, 0x53, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x42,
+  0x79, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x20,
+  0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
+  0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x66, 0x6f,
+  0x72, 0x6d, 0x61, 0x74, 0x2c, 0x20, 0x75, 0x6e, 0x73, 0x6f, 0x72, 0x74,
+  0x65, 0x64, 0x2e, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73,
+  0x20, 0x2d, 0x2d, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x74, 0x79, 0x70,
+  0x65, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x53, 0x6f, 0x72, 0x74, 0x65, 0x64,
+  0x42, 0x79, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x42, 0x41, 0x4d,
+  0x5f, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74,
+  0x6f, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x6f, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x66,
+  0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x20, 0x75, 0x6e, 0x73, 0x6f, 0x72,
+  0x74, 0x65, 0x64, 0x2e, 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
+  0x73, 0x20, 0x2d, 0x2d, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x4d, 0x6f, 0x64,
+  0x65, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x6f, 0x6d, 0x65, 0x53, 0x41, 0x4d, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x52,
+  0x65, 0x61, 0x64, 0x73, 0x55, 0x6e, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20,
+  0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x6f, 0x75, 0x74, 0x70,
+  0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x6e, 0x6d, 0x61, 0x70, 0x70,
+  0x65, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x28, 0x62, 0x65,
+  0x73, 0x69, 0x64, 0x65, 0x73, 0x20, 0x53, 0x41, 0x4d, 0x29, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20,
+  0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20, 0x6f, 0x75,
+  0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x46, 0x61, 0x73, 0x74, 0x78, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x73,
+  0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x20, 0x66, 0x61, 0x73, 0x74,
+  0x61, 0x2f, 0x66, 0x61, 0x73, 0x74, 0x71, 0x20, 0x66, 0x69, 0x6c, 0x65,
+  0x73, 0x2c, 0x20, 0x55, 0x6e, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x2e,
+  0x6f, 0x75, 0x74, 0x2e, 0x6d, 0x61, 0x74, 0x65, 0x31, 0x2f, 0x32, 0x0a,
+  0x0a, 0x6f, 0x75, 0x74, 0x51, 0x53, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72,
+  0x73, 0x69, 0x6f, 0x6e, 0x41, 0x64, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x61, 0x64, 0x64, 0x20, 0x74,
+  0x68, 0x69, 0x73, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74,
+  0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74,
+  0x79, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x28, 0x65, 0x2e, 0x67,
+  0x2e, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74,
+  0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x49, 0x6c, 0x6c, 0x75, 0x6d, 0x69,
+  0x6e, 0x61, 0x20, 0x74, 0x6f, 0x20, 0x53, 0x61, 0x6e, 0x67, 0x65, 0x72,
+  0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x2d, 0x33, 0x31, 0x29, 0x0a, 0x0a,
+  0x6f, 0x75, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x70, 0x70,
+  0x65, 0x72, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x6c, 0x64, 0x5f,
+  0x32, 0x2e, 0x34, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69,
+  0x6e, 0x67, 0x3a, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66,
+  0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e,
+  0x67, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+  0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70,
+  0x75, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x6c, 0x64, 0x5f, 0x32, 0x2e, 0x34,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x71, 0x75, 0x61, 0x73, 0x69, 0x2d, 0x72,
+  0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20,
+  0x75, 0x73, 0x65, 0x64, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20,
+  0x32, 0x2e, 0x35, 0x2e, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e,
+  0x2e, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x20, 0x6f, 0x72, 0x64,
+  0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d,
+  0x65, 0x6e, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63,
+  0x68, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6d, 0x61, 0x70, 0x70,
+  0x65, 0x72, 0x2e, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x6d, 0x61, 0x74,
+  0x65, 0x73, 0x20, 0x28, 0x70, 0x61, 0x69, 0x72, 0x73, 0x29, 0x20, 0x61,
+  0x72, 0x65, 0x20, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x20, 0x61, 0x64,
+  0x6a, 0x61, 0x63, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6f,
+  0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20,
+  0x73, 0x74, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65,
+  0x72, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x70, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x63, 0x6f,
+  0x6d, 0x65, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x69,
+  0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65,
+  0x20, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x73, 0x2e, 0x0a, 0x0a,
+  0x23, 0x23, 0x23, 0x20, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x3a, 0x20,
+  0x53, 0x41, 0x4d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x42, 0x41, 0x4d, 0x0a,
+  0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x41, 0x4d, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x3a,
+  0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x41, 0x4d,
+  0x2f, 0x42, 0x41, 0x4d, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x73, 0x74, 0x20,
+  0x77, 0x6f, 0x72, 0x64, 0x3a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
+  0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x77,
+  0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x69,
+  0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53,
+  0x41, 0x4d, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x75, 0x74, 0x70,
+  0x75, 0x74, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f,
+  0x75, 0x74, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20,
+  0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20, 0x53, 0x41, 0x4d, 0x2f, 0x42,
+  0x41, 0x4d, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x6e, 0x64, 0x2c, 0x20, 0x33,
+  0x72, 0x64, 0x3a, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x55, 0x6e, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
+  0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x75, 0x6e, 0x73,
+  0x6f, 0x72, 0x74, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x53, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x42, 0x79, 0x43, 0x6f,
+  0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x63,
+  0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x2e, 0x20, 0x54,
+  0x68, 0x69, 0x73, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77,
+  0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65,
+  0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72,
+  0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x69, 0x6e,
+  0x67, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x63, 0x61, 0x6e, 0x20,
+  0x62, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64,
+  0x20, 0x62, 0x79, 0x20, 0x2d, 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42,
+  0x41, 0x4d, 0x73, 0x6f, 0x72, 0x74, 0x52, 0x41, 0x4d, 0x2e, 0x0a, 0x0a,
+  0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x46, 0x75, 0x6c, 0x6c,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a,
+  0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x41, 0x4d,
+  0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x20, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x2e,
+  0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x6f, 0x75,
+  0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x46, 0x75, 0x6c, 0x6c, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x66, 0x75,
+  0x6c, 0x6c, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75,
+  0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f,
+  0x51, 0x53, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20,
+  0x53, 0x41, 0x4d, 0x20, 0x62, 0x75, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68,
+  0x6f, 0x75, 0x74, 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x20,
+  0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53,
+  0x41, 0x4d, 0x73, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x46, 0x69, 0x65, 0x6c,
+  0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a,
+  0x20, 0x43, 0x75, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x2d, 0x6c,
+  0x69, 0x6b, 0x65, 0x20, 0x73, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x20, 0x66,
+  0x69, 0x65, 0x6c, 0x64, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f,
+  0x74, 0x20, 0x75, 0x73, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x4d, 0x6f, 0x74,
+  0x69, 0x66, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x72, 0x61, 0x6e,
+  0x64, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x20, 0x66, 0x72,
+  0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f,
+  0x6e, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2e, 0x20, 0x52, 0x65, 0x61,
+  0x64, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x69, 0x6e, 0x63, 0x6f,
+  0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x6e, 0x64,
+  0x2f, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6e, 0x6f,
+  0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e,
+  0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72,
+  0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74,
+  0x53, 0x41, 0x4d, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+  0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72,
+  0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
+  0x3a, 0x20, 0x61, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f,
+  0x66, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x20, 0x53, 0x41,
+  0x4d, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73,
+  0x2c, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64,
+  0x65, 0x72, 0x20, 0x64, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x20, 0x66,
+  0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75,
+  0x74, 0x20, 0x53, 0x41, 0x4d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x4e, 0x48, 0x20, 0x48, 0x49, 0x20, 0x41, 0x53, 0x20, 0x6e,
+  0x4d, 0x20, 0x4e, 0x4d, 0x20, 0x4d, 0x44, 0x20, 0x6a, 0x4d, 0x20, 0x6a,
+  0x49, 0x20, 0x58, 0x53, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61, 0x6e, 0x79,
+  0x20, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+  0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x72, 0x64, 0x65,
+  0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x74,
+  0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x4e, 0x48, 0x20, 0x48, 0x49, 0x20, 0x41, 0x53, 0x20, 0x6e, 0x4d,
+  0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x6c,
+  0x6c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x4e, 0x48, 0x20, 0x48, 0x49, 0x20, 0x41, 0x53, 0x20, 0x6e, 0x4d,
+  0x20, 0x4e, 0x4d, 0x20, 0x4d, 0x44, 0x20, 0x6a, 0x4d, 0x20, 0x6a, 0x49,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e,
+  0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
+  0x6e, 0x6f, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+  0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x61, 0x74, 0x74,
+  0x72, 0x49, 0x48, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61,
+  0x72, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x6f, 0x72,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x48, 0x20, 0x61, 0x74, 0x74, 0x72,
+  0x69, 0x62, 0x75, 0x74, 0x65, 0x2e, 0x20, 0x30, 0x20, 0x6d, 0x61, 0x79,
+  0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64,
+  0x20, 0x62, 0x79, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x64, 0x6f, 0x77,
+  0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x73, 0x6f, 0x66, 0x74,
+  0x77, 0x61, 0x72, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61,
+  0x73, 0x20, 0x43, 0x75, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x20,
+  0x6f, 0x72, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x65,
+  0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x75, 0x6e, 0x6d,
+  0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e,
+  0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69,
+  0x6e, 0x67, 0x3a, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x6f,
+  0x66, 0x20, 0x75, 0x6e, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x72,
+  0x65, 0x61, 0x64, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x53, 0x41, 0x4d, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20,
+  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20, 0x6f, 0x75, 0x74,
+  0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x57, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f,
+  0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x75, 0x6e, 0x6d, 0x61, 0x70, 0x70,
+  0x65, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x77, 0x69, 0x74,
+  0x68, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x69, 0x6e,
+  0x20, 0x53, 0x41, 0x4d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x69,
+  0x2e, 0x65, 0x2e, 0x20, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x2e,
+  0x6f, 0x75, 0x74, 0x2e, 0x73, 0x61, 0x6d, 0x29, 0x0a, 0x0a, 0x6f, 0x75,
+  0x74, 0x53, 0x41, 0x4d, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x69, 0x72, 0x65, 0x64,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a,
+  0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x6f, 0x72,
+  0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x53, 0x41, 0x4d, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x69, 0x72,
+  0x65, 0x64, 0x3a, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x74, 0x65,
+  0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f,
+  0x74, 0x68, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c,
+  0x20, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67,
+  0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x50, 0x61, 0x69, 0x72, 0x65, 0x64, 0x4b, 0x65, 0x65,
+  0x70, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x3a,
+  0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x61, 0x66,
+  0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65,
+  0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x61,
+  0x69, 0x72, 0x65, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65,
+  0x6e, 0x74, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x72, 0x64,
+  0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x6b, 0x65, 0x70, 0x74, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x73, 0x20, 0x69,
+  0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20,
+  0x46, 0x41, 0x53, 0x54, 0x51, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x0a,
+  0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x70, 0x72, 0x69, 0x6d, 0x61,
+  0x72, 0x79, 0x46, 0x6c, 0x61, 0x67, 0x09, 0x09, 0x4f, 0x6e, 0x65, 0x42,
+  0x65, 0x73, 0x74, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x77, 0x68, 0x69,
+  0x63, 0x68, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+  0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64,
+  0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79,
+  0x20, 0x2d, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72,
+  0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x61,
+  0x72, 0x6b, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x30, 0x78,
+  0x31, 0x30, 0x30, 0x20, 0x62, 0x69, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x46, 0x4c, 0x41, 0x47, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x4f, 0x6e, 0x65, 0x42, 0x65, 0x73, 0x74, 0x53,
+  0x63, 0x6f, 0x72, 0x65, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x6e, 0x6c,
+  0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d,
+  0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x20,
+  0x69, 0x73, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x6c, 0x6c, 0x42, 0x65,
+  0x73, 0x74, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
+  0x61, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
+  0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x62, 0x65, 0x73, 0x74, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x61,
+  0x72, 0x65, 0x20, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x0a, 0x0a,
+  0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x72, 0x65, 0x61, 0x64, 0x49, 0x44,
+  0x09, 0x09, 0x09, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20,
+  0x72, 0x65, 0x61, 0x64, 0x20, 0x49, 0x44, 0x20, 0x72, 0x65, 0x63, 0x6f,
+  0x72, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64,
+  0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x77,
+  0x6f, 0x72, 0x64, 0x20, 0x28, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x73,
+  0x70, 0x61, 0x63, 0x65, 0x29, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x46, 0x41, 0x53, 0x54, 0x78, 0x20, 0x72, 0x65, 0x61,
+  0x64, 0x20, 0x49, 0x44, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x72,
+  0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x2f, 0x31, 0x2c, 0x2f,
+  0x32, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65,
+  0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e,
+  0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
+  0x72, 0x65, 0x61, 0x64, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20,
+  0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x46, 0x41, 0x53, 0x54, 0x78, 0x20, 0x66, 0x69, 0x6c,
+  0x65, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x6d, 0x61, 0x70,
+  0x71, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x32, 0x35, 0x35, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x6e, 0x74, 0x3a, 0x20, 0x30, 0x20, 0x74, 0x6f, 0x20, 0x32, 0x35, 0x35,
+  0x3a, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x41, 0x50, 0x51, 0x20, 0x76,
+  0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x75, 0x6e, 0x69,
+  0x71, 0x75, 0x65, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x0a,
+  0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x66, 0x6c, 0x61, 0x67, 0x4f,
+  0x52, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x30,
+  0x20, 0x74, 0x6f, 0x20, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3a, 0x20, 0x73,
+  0x61, 0x6d, 0x20, 0x46, 0x4c, 0x41, 0x47, 0x20, 0x77, 0x69, 0x6c, 0x6c,
+  0x20, 0x62, 0x65, 0x20, 0x62, 0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20,
+  0x4f, 0x52, 0x27, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68,
+  0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x2e,
+  0x65, 0x2e, 0x20, 0x46, 0x4c, 0x41, 0x47, 0x3d, 0x46, 0x4c, 0x41, 0x47,
+  0x20, 0x7c, 0x20, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x66, 0x6c, 0x61,
+  0x67, 0x4f, 0x52, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73,
+  0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x61, 0x66, 0x74,
+  0x65, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73,
+  0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x73,
+  0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x53, 0x54, 0x41, 0x52, 0x2c, 0x20,
+  0x61, 0x6e, 0x64, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x75,
+  0x74, 0x53, 0x41, 0x4d, 0x66, 0x6c, 0x61, 0x67, 0x41, 0x4e, 0x44, 0x2e,
+  0x20, 0x43, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64,
+  0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63,
+  0x69, 0x66, 0x69, 0x63, 0x20, 0x62, 0x69, 0x74, 0x73, 0x20, 0x74, 0x68,
+  0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73,
+  0x65, 0x74, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65,
+  0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x66, 0x6c, 0x61,
+  0x67, 0x41, 0x4e, 0x44, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x36, 0x35, 0x35, 0x33, 0x35, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x30, 0x20, 0x74, 0x6f, 0x20, 0x36,
+  0x35, 0x35, 0x33, 0x35, 0x3a, 0x20, 0x73, 0x61, 0x6d, 0x20, 0x46, 0x4c,
+  0x41, 0x47, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x62,
+  0x69, 0x74, 0x77, 0x69, 0x73, 0x65, 0x20, 0x41, 0x4e, 0x44, 0x27, 0x64,
+  0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76,
+  0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x46,
+  0x4c, 0x41, 0x47, 0x3d, 0x46, 0x4c, 0x41, 0x47, 0x20, 0x26, 0x20, 0x6f,
+  0x75, 0x74, 0x53, 0x41, 0x4d, 0x66, 0x6c, 0x61, 0x67, 0x4f, 0x52, 0x2e,
+  0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x70, 0x70,
+  0x6c, 0x69, 0x65, 0x64, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x61,
+  0x6c, 0x6c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x68, 0x61, 0x76,
+  0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x20, 0x62,
+  0x79, 0x20, 0x53, 0x54, 0x41, 0x52, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20,
+  0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x53, 0x41,
+  0x4d, 0x66, 0x6c, 0x61, 0x67, 0x4f, 0x52, 0x2e, 0x20, 0x43, 0x61, 0x6e,
+  0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
+  0x75, 0x6e, 0x73, 0x65, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66,
+  0x69, 0x63, 0x20, 0x62, 0x69, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74,
+  0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x65, 0x74,
+  0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x2e, 0x0a,
+  0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x61, 0x74, 0x74, 0x72, 0x52,
+  0x47, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
+  0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x53, 0x41, 0x4d, 0x2f, 0x42, 0x41,
+  0x4d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70,
+  0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x66,
+  0x69, 0x72, 0x73, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x63, 0x6f,
+  0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72,
+  0x65, 0x61, 0x64, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x69, 0x64,
+  0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64,
+  0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20,
+  0x77, 0x69, 0x74, 0x68, 0x20, 0x22, 0x49, 0x44, 0x3a, 0x22, 0x2c, 0x20,
+  0x65, 0x2e, 0x67, 0x2e, 0x20, 0x2d, 0x2d, 0x6f, 0x75, 0x74, 0x53, 0x41,
+  0x4d, 0x61, 0x74, 0x74, 0x72, 0x52, 0x47, 0x6c, 0x69, 0x6e, 0x65, 0x20,
+  0x49, 0x44, 0x3a, 0x78, 0x78, 0x78, 0x20, 0x43, 0x4e, 0x3a, 0x79, 0x79,
+  0x20, 0x22, 0x44, 0x53, 0x3a, 0x7a, 0x20, 0x7a, 0x20, 0x7a, 0x22, 0x2e,
+  0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x78, 0x78, 0x78, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62,
+  0x65, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x52,
+  0x47, 0x20, 0x74, 0x61, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x61, 0x63,
+  0x68, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x61, 0x6c, 0x69,
+  0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x20, 0x41, 0x6e, 0x79, 0x20,
+  0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x74, 0x61, 0x67, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73,
+  0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20,
+  0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x20, 0x71, 0x75, 0x6f, 0x74, 0x65,
+  0x64, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x20, 0x73, 0x65, 0x70,
+  0x61, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x52, 0x47, 0x20, 0x6c, 0x69,
+  0x6e, 0x65, 0x73, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f,
+  0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72,
+  0x65, 0x6e, 0x74, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x20, 0x73,
+  0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x64, 0x29, 0x20, 0x69, 0x6e,
+  0x70, 0x75, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x69, 0x6e,
+  0x20, 0x2d, 0x2d, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73,
+  0x49, 0x6e, 0x2e, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x73, 0x20, 0x68,
+  0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x73, 0x75,
+  0x72, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20,
+  0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x65, 0x2e, 0x67, 0x2e,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x2d, 0x2d, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x61, 0x74, 0x74,
+  0x72, 0x52, 0x47, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x49, 0x44, 0x3a, 0x78,
+  0x78, 0x78, 0x20, 0x2c, 0x20, 0x49, 0x44, 0x3a, 0x7a, 0x7a, 0x7a, 0x20,
+  0x22, 0x44, 0x53, 0x3a, 0x7a, 0x20, 0x7a, 0x22, 0x20, 0x2c, 0x20, 0x49,
+  0x44, 0x3a, 0x79, 0x79, 0x79, 0x20, 0x44, 0x53, 0x3a, 0x79, 0x79, 0x79,
+  0x79, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x68, 0x65, 0x61,
+  0x64, 0x65, 0x72, 0x48, 0x44, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72,
+  0x69, 0x6e, 0x67, 0x73, 0x3a, 0x20, 0x40, 0x48, 0x44, 0x20, 0x28, 0x68,
+  0x65, 0x61, 0x64, 0x65, 0x72, 0x29, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x68,
+  0x65, 0x61, 0x64, 0x65, 0x72, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41,
+  0x4d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x50, 0x47, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x20, 0x65, 0x78,
+  0x74, 0x72, 0x61, 0x20, 0x40, 0x50, 0x47, 0x20, 0x28, 0x73, 0x6f, 0x66,
+  0x74, 0x77, 0x61, 0x72, 0x65, 0x29, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x68,
+  0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x28, 0x69, 0x6e, 0x20, 0x61, 0x64,
+  0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x53, 0x54,
+  0x41, 0x52, 0x29, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x68,
+  0x65, 0x61, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74,
+  0x46, 0x69, 0x6c, 0x65, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73,
+  0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20,
+  0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20,
+  0x77, 0x69, 0x74, 0x68, 0x20, 0x40, 0x43, 0x4f, 0x20, 0x28, 0x63, 0x6f,
+  0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x41, 0x4d, 0x20,
+  0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53,
+  0x41, 0x4d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28,
+  0x73, 0x29, 0x3a, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x69, 0x6e,
+  0x74, 0x6f, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x53, 0x41, 0x4d, 0x2f,
+  0x42, 0x41, 0x4d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4b, 0x65,
+  0x65, 0x70, 0x4f, 0x6e, 0x6c, 0x79, 0x41, 0x64, 0x64, 0x65, 0x64, 0x52,
+  0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x2e, 0x2e,
+  0x2e, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6b, 0x65, 0x65, 0x70, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x66, 0x6f,
+  0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x6c, 0x6c, 0x20,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x61,
+  0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78,
+  0x74, 0x72, 0x61, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63,
+  0x65, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x20,
+  0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x2d,
+  0x2d, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x46, 0x61, 0x73, 0x74, 0x61,
+  0x46, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x74, 0x61,
+  0x67, 0x65, 0x2e, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x41, 0x4d, 0x6d,
+  0x75, 0x6c, 0x74, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d,
+  0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69,
+  0x70, 0x6c, 0x65, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
+  0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x72, 0x65, 0x61,
+  0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20,
+  0x62, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x74, 0x6f,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x41, 0x4d, 0x2f, 0x42, 0x41, 0x4d,
+  0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x31, 0x20, 0x2e,
+  0x2e, 0x2e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+  0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x28, 0x75, 0x70, 0x20, 0x74, 0x6f,
+  0x20, 0x2d, 0x2d, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72,
+  0x4d, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x70, 0x4e, 0x6d, 0x61, 0x78,
+  0x29, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75,
+  0x74, 0x70, 0x75, 0x74, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x42, 0x41, 0x4d,
+  0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x3a, 0x20, 0x2d, 0x31, 0x20, 0x74, 0x6f, 0x20, 0x31,
+  0x30, 0x20, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72,
+  0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c,
+  0x2c, 0x20, 0x2d, 0x31, 0x3d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,
+  0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+  0x20, 0x28, 0x36, 0x3f, 0x29, 0x2c, 0x20, 0x30, 0x3d, 0x6e, 0x6f, 0x20,
+  0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2c,
+  0x20, 0x31, 0x30, 0x3d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20,
+  0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x0a,
+  0x0a, 0x6f, 0x75, 0x74, 0x42, 0x41, 0x4d, 0x73, 0x6f, 0x72, 0x74, 0x69,
+  0x6e, 0x67, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x4e, 0x20, 0x20, 0x20,
+  0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20,
+  0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x66,
+  0x6f, 0x72, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x69,
+  0x6e, 0x67, 0x2e, 0x20, 0x30, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x64,
+  0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x69,
+  0x6e, 0x28, 0x36, 0x2c, 0x2d, 0x2d, 0x72, 0x75, 0x6e, 0x54, 0x68, 0x72,
+  0x65, 0x61, 0x64, 0x4e, 0x29, 0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20,
+  0x42, 0x41, 0x4d, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69,
+  0x6e, 0x67, 0x0a, 0x0a, 0x62, 0x61, 0x6d, 0x52, 0x65, 0x6d, 0x6f, 0x76,
+  0x65, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x54,
+  0x79, 0x70, 0x65, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73,
+  0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x20,
+  0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x69,
+  0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42, 0x41, 0x4d, 0x20, 0x66, 0x69,
+  0x6c, 0x65, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x77, 0x20,
+  0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x77,
+  0x69, 0x74, 0x68, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x42,
+  0x41, 0x4d, 0x20, 0x66, 0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x77, 0x69,
+  0x74, 0x68, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x42, 0x41, 0x4d, 0x66,
+  0x69, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
+  0x6e, 0x6f, 0x20, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65,
+  0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x2f, 0x6d, 0x61, 0x72,
+  0x6b, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49,
+  0x64, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6d, 0x75,
+  0x6c, 0x74, 0x69, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2c, 0x20,
+  0x61, 0x6e, 0x64, 0x20, 0x64, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74,
+  0x65, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x6d, 0x61, 0x70,
+  0x70, 0x65, 0x72, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f,
+  0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x2c, 0x20, 0x46,
+  0x4c, 0x41, 0x47, 0x2c, 0x20, 0x43, 0x49, 0x47, 0x41, 0x52, 0x20, 0x6d,
+  0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74,
+  0x69, 0x63, 0x61, 0x6c, 0x0a, 0x0a, 0x62, 0x61, 0x6d, 0x52, 0x65, 0x6d,
+  0x6f, 0x76, 0x65, 0x44, 0x75, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x65,
+  0x73, 0x4d, 0x61, 0x74, 0x65, 0x32, 0x62, 0x61, 0x73, 0x65, 0x73, 0x4e,
+  0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
+  0x3e, 0x30, 0x3a, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f,
+  0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x35, 0x27, 0x20, 0x6f, 0x66, 0x20, 0x6d,
+  0x61, 0x74, 0x65, 0x20, 0x32, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65,
+  0x20, 0x69, 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x69,
+  0x6e, 0x67, 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x66, 0x6f, 0x72,
+  0x20, 0x52, 0x41, 0x4d, 0x50, 0x41, 0x47, 0x45, 0x29, 0x0a, 0x0a, 0x23,
+  0x23, 0x23, 0x20, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x57, 0x69,
+  0x67, 0x67, 0x6c, 0x65, 0x0a, 0x6f, 0x75, 0x74, 0x57, 0x69, 0x67, 0x54,
+  0x79, 0x70, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74,
+  0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x74, 0x79, 0x70,
+  0x65, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20,
+  0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x65, 0x2e, 0x67, 0x2e,
+  0x20, 0x22, 0x62, 0x65, 0x64, 0x47, 0x72, 0x61, 0x70, 0x68, 0x22, 0x20,
+  0x4f, 0x52, 0x20, 0x22, 0x62, 0x65, 0x64, 0x47, 0x72, 0x61, 0x70, 0x68,
+  0x20, 0x72, 0x65, 0x61, 0x64, 0x31, 0x5f, 0x35, 0x70, 0x22, 0x2e, 0x20,
+  0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x20, 0x73, 0x6f, 0x72,
+  0x74, 0x65, 0x64, 0x20, 0x42, 0x41, 0x4d, 0x3a, 0x20, 0x2d, 0x2d, 0x6f,
+  0x75, 0x74, 0x53, 0x41, 0x4d, 0x74, 0x79, 0x70, 0x65, 0x20, 0x42, 0x41,
+  0x4d, 0x20, 0x53, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x42, 0x79, 0x43, 0x6f,
+  0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x20, 0x2e, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x73, 0x74, 0x20, 0x77,
+  0x6f, 0x72, 0x64, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61,
+  0x6c, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x65, 0x64, 0x47, 0x72, 0x61, 0x70,
+  0x68, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x62, 0x65, 0x64, 0x47,
+  0x72, 0x61, 0x70, 0x68, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x67,
+  0x67, 0x6c, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
+  0x77, 0x69, 0x67, 0x67, 0x6c, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61,
+  0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32, 0x6e,
+  0x64, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64, 0x31, 0x5f, 0x35, 0x70,
+  0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x61,
+  0x6c, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20,
+  0x35, 0x27, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x31, 0x73,
+  0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x66,
+  0x75, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x43, 0x41, 0x47, 0x45, 0x2f,
+  0x52, 0x41, 0x4d, 0x50, 0x41, 0x47, 0x45, 0x20, 0x65, 0x74, 0x63, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64,
+  0x32, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x73,
+  0x69, 0x67, 0x6e, 0x61, 0x6c, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x6f,
+  0x6e, 0x6c, 0x79, 0x20, 0x32, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x6f, 0x75,
+  0x74, 0x57, 0x69, 0x67, 0x53, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x74, 0x72, 0x61, 0x6e, 0x64,
+  0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e,
+  0x67, 0x3a, 0x20, 0x73, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x6e,
+  0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x69, 0x67, 0x67, 0x6c,
+  0x65, 0x2f, 0x62, 0x65, 0x64, 0x47, 0x72, 0x61, 0x70, 0x68, 0x20, 0x6f,
+  0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x53, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x20,
+  0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61,
+  0x74, 0x65, 0x20, 0x73, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x2c, 0x20,
+  0x73, 0x74, 0x72, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x72,
+  0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x55, 0x6e,
+  0x73, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x20,
+  0x73, 0x74, 0x72, 0x61, 0x6e, 0x64, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74,
+  0x57, 0x69, 0x67, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
+  0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x20, 0x20, 0x20, 0x2d,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a,
+  0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x6d, 0x61, 0x74, 0x63,
+  0x68, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
+  0x63, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20,
+  0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x77, 0x69,
+  0x67, 0x67, 0x6c, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x65,
+  0x2e, 0x67, 0x2e, 0x20, 0x22, 0x63, 0x68, 0x72, 0x22, 0x2c, 0x20, 0x64,
+  0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x22, 0x2d, 0x22, 0x20, 0x2d,
+  0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x61, 0x6c, 0x6c,
+  0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x0a,
+  0x20, 0x0a, 0x6f, 0x75, 0x74, 0x57, 0x69, 0x67, 0x4e, 0x6f, 0x72, 0x6d,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x52, 0x50, 0x4d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74,
+  0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f,
+  0x66, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x50, 0x4d, 0x20, 0x20,
+  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20,
+  0x70, 0x65, 0x72, 0x20, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x6f, 0x6e, 0x20,
+  0x6f, 0x66, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x72, 0x65,
+  0x61, 0x64, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x20, 0x20, 0x2e,
+  0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c,
+  0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x22, 0x72, 0x61,
+  0x77, 0x22, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x0a, 0x0a, 0x23,
+  0x23, 0x23, 0x20, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x46, 0x69,
+  0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x6f, 0x75, 0x74, 0x46,
+  0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x74,
+  0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65,
+  0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x20, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x66, 0x69,
+  0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x69, 0x6e,
+  0x67, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65,
+  0x6e, 0x74, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x42, 0x79, 0x53,
+  0x4a, 0x6f, 0x75, 0x74, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6b, 0x65, 0x65,
+  0x70, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x6f, 0x73, 0x65,
+  0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+  0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x6a, 0x75, 0x6e, 0x63,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x70,
+  0x61, 0x73, 0x73, 0x65, 0x64, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72,
+  0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x53, 0x4a, 0x2e,
+  0x6f, 0x75, 0x74, 0x2e, 0x74, 0x61, 0x62, 0x0a, 0x0a, 0x6f, 0x75, 0x74,
+  0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x6d,
+  0x61, 0x70, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x6e, 0x74, 0x3a, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x63, 0x6f, 0x72,
+  0x65, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x6f,
+  0x77, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75,
+  0x6d, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20,
+  0x6d, 0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67,
+  0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a,
+  0x0a, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x75,
+  0x6c, 0x74, 0x69, 0x6d, 0x61, 0x70, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x72, 0x65, 0x61,
+  0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+  0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75, 0x74,
+  0x70, 0x75, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6d, 0x61, 0x70,
+  0x73, 0x20, 0x66, 0x65, 0x77, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e,
+  0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c,
+  0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x20, 0x6e,
+  0x6f, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+  0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75, 0x74,
+  0x70, 0x75, 0x74, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x74,
+  0x65, 0x72, 0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6d,
+  0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x31, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a,
+  0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77,
+  0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75,
+  0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74,
+  0x20, 0x68, 0x61, 0x73, 0x20, 0x66, 0x65, 0x77, 0x65, 0x72, 0x20, 0x6d,
+  0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68,
+  0x61, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75,
+  0x65, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72,
+  0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6f, 0x76, 0x65,
+  0x72, 0x4c, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30,
+  0x2e, 0x33, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69,
+  0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
+  0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x73,
+  0x20, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x69,
+  0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20,
+  0x2a, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x2a, 0x20, 0x6c, 0x65, 0x6e,
+  0x67, 0x74, 0x68, 0x20, 0x69, 0x73, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20,
+  0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61,
+  0x6c, 0x75, 0x65, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x74,
+  0x65, 0x72, 0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6f,
+  0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x4c, 0x6d, 0x61, 0x78, 0x20,
+  0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69,
+  0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
+  0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x73,
+  0x20, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x69,
+  0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20,
+  0x2a, 0x72, 0x65, 0x61, 0x64, 0x2a, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74,
+  0x68, 0x20, 0x69, 0x73, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68,
+  0x61, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75,
+  0x65, 0x0a, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65,
+  0x72, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x61,
+  0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x6c,
+  0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20,
+  0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x73, 0x20,
+  0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x68, 0x69, 0x67,
+  0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x69,
+  0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x0a, 0x6f, 0x75, 0x74,
+  0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x4d,
+  0x69, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x4c, 0x72, 0x65, 0x61, 0x64, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x2e, 0x36, 0x36, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a,
+  0x20, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x63,
+  0x6f, 0x72, 0x65, 0x4d, 0x69, 0x6e, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61,
+  0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61,
+  0x64, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x28, 0x73, 0x75,
+  0x6d, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x27, 0x20,
+  0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20,
+  0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x2d, 0x65, 0x6e, 0x64, 0x20, 0x72,
+  0x65, 0x61, 0x64, 0x73, 0x29, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x46, 0x69,
+  0x6c, 0x74, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6d, 0x69,
+  0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
+  0x3a, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20,
+  0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70,
+  0x75, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66,
+  0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x20, 0x62, 0x61, 0x73,
+  0x65, 0x73, 0x20, 0x69, 0x73, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72,
+  0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76,
+  0x61, 0x6c, 0x75, 0x65, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c,
+  0x74, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6d, 0x69, 0x6e,
+  0x4f, 0x76, 0x65, 0x72, 0x4c, 0x72, 0x65, 0x61, 0x64, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x30, 0x2e, 0x36, 0x36, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
+  0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x20, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c,
+  0x74, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x6d, 0x69, 0x6e,
+  0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20,
+  0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x65, 0x6e, 0x67,
+  0x74, 0x68, 0x20, 0x28, 0x73, 0x75, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x6d,
+  0x61, 0x74, 0x65, 0x73, 0x27, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
+  0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64,
+  0x2d, 0x65, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x29, 0x0a,
+  0x0a, 0x6f, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x49, 0x6e,
+  0x74, 0x72, 0x6f, 0x6e, 0x4d, 0x6f, 0x74, 0x69, 0x66, 0x73, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e,
+  0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
+  0x3a, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6c, 0x69,
+  0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67,
+  0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66,
+  0x73, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x4e, 0x6f, 0x6e, 0x65, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x74,
+  0x65, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x52, 0x65,
+  0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x6e, 0x63, 0x61, 0x6e, 0x6f, 0x6e,
+  0x69, 0x63, 0x61, 0x6c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x66, 0x69, 0x6c,
+  0x74, 0x65, 0x72, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6c, 0x69, 0x67,
+  0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20,
+  0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x6e, 0x6f, 0x6e, 0x2d,
+  0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6a, 0x75,
+  0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x09, 0x09, 0x09, 0x09,
+  0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x6e, 0x63, 0x61, 0x6e,
+  0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x55, 0x6e, 0x61, 0x6e, 0x6e, 0x6f,
+  0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x66,
+  0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6c,
+  0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61,
+  0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x6e, 0x6f,
+  0x6e, 0x2d, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20,
+  0x75, 0x6e, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20,
+  0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x77, 0x68,
+  0x65, 0x6e, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x6e,
+  0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63,
+  0x65, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
+  0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x20, 0x54, 0x68,
+  0x65, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20,
+  0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61,
+  0x6c, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20,
+  0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6b, 0x65, 0x70, 0x74,
+  0x2e, 0x0a, 0x0a, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x4f, 0x75, 0x74,
+  0x70, 0x75, 0x74, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e,
+  0x67, 0x3a, 0x20, 0x53, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x4a, 0x75,
+  0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x6f, 0x75, 0x74, 0x53,
+  0x4a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x73,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x41, 0x6c, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x77, 0x68, 0x69, 0x63,
+  0x68, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63,
+  0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20,
+  0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x64, 0x20, 0x73, 0x70,
+  0x6c, 0x69, 0x63, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x73, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x41, 0x6c, 0x6c, 0x3a, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72,
+  0x65, 0x61, 0x64, 0x73, 0x2c, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65,
+  0x2d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d,
+  0x6d, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x3a, 0x20, 0x75, 0x6e, 0x69, 0x71,
+  0x75, 0x65, 0x6c, 0x79, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67,
+  0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x0a,
+  0x0a, 0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72,
+  0x4f, 0x76, 0x65, 0x72, 0x68, 0x61, 0x6e, 0x67, 0x4d, 0x69, 0x6e, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x33, 0x30, 0x20,
+  0x20, 0x31, 0x32, 0x20, 0x20, 0x31, 0x32, 0x20, 0x20, 0x31, 0x32, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x34, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65,
+  0x72, 0x73, 0x3a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d,
+  0x75, 0x6d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x61, 0x6e, 0x67, 0x20,
+  0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73,
+  0x70, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69,
+  0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20,
+  0x73, 0x69, 0x64, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x3a, 0x20, 0x28,
+  0x31, 0x29, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6e, 0x6f, 0x6e,
+  0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x73, 0x2c,
+  0x20, 0x28, 0x32, 0x29, 0x20, 0x47, 0x54, 0x2f, 0x41, 0x47, 0x20, 0x61,
+  0x6e, 0x64, 0x20, 0x43, 0x54, 0x2f, 0x41, 0x43, 0x20, 0x6d, 0x6f, 0x74,
+  0x69, 0x66, 0x2c, 0x20, 0x28, 0x33, 0x29, 0x20, 0x47, 0x43, 0x2f, 0x41,
+  0x47, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x54, 0x2f, 0x47, 0x43, 0x20,
+  0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2c, 0x20, 0x28, 0x34, 0x29, 0x20, 0x41,
+  0x54, 0x2f, 0x41, 0x43, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x54, 0x2f,
+  0x41, 0x54, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2e, 0x20, 0x2d, 0x31,
+  0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x6f, 0x75,
+  0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x61,
+  0x74, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74,
+  0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e,
+  0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6a, 0x75, 0x6e, 0x63,
+  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x4a,
+  0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x55,
+  0x6e, 0x69, 0x71, 0x75, 0x65, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x33, 0x20, 0x20, 0x20, 0x31, 0x20, 0x20, 0x20, 0x31,
+  0x20, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x20,
+  0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x73, 0x3a, 0x20, 0x6d, 0x69,
+  0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65,
+  0x6c, 0x79, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x72,
+  0x65, 0x61, 0x64, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x70, 0x65,
+  0x72, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66,
+  0x6f, 0x72, 0x3a, 0x20, 0x28, 0x31, 0x29, 0x20, 0x6e, 0x6f, 0x6e, 0x2d,
+  0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f,
+  0x74, 0x69, 0x66, 0x73, 0x2c, 0x20, 0x28, 0x32, 0x29, 0x20, 0x47, 0x54,
+  0x2f, 0x41, 0x47, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x54, 0x2f, 0x41,
+  0x43, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2c, 0x20, 0x28, 0x33, 0x29,
+  0x20, 0x47, 0x43, 0x2f, 0x41, 0x47, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43,
+  0x54, 0x2f, 0x47, 0x43, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2c, 0x20,
+  0x28, 0x34, 0x29, 0x20, 0x41, 0x54, 0x2f, 0x41, 0x43, 0x20, 0x61, 0x6e,
+  0x64, 0x20, 0x47, 0x54, 0x2f, 0x41, 0x54, 0x20, 0x6d, 0x6f, 0x74, 0x69,
+  0x66, 0x2e, 0x20, 0x2d, 0x31, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20,
+  0x6e, 0x6f, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x6f,
+  0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4a, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6f,
+  0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x6e, 0x65,
+  0x20, 0x6f, 0x66, 0x20, 0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c,
+  0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x69, 0x71,
+  0x75, 0x65, 0x4d, 0x69, 0x6e, 0x20, 0x4f, 0x52, 0x20, 0x6f, 0x75, 0x74,
+  0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e,
+  0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x20, 0x63, 0x6f,
+  0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x65,
+  0x20, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x69, 0x65, 0x64, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20,
+  0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f,
+  0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6a,
+  0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x6f, 0x75,
+  0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75,
+  0x6e, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x33, 0x20, 0x20, 0x20, 0x31, 0x20, 0x20, 0x20, 0x31,
+  0x20, 0x20, 0x20, 0x31, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x20,
+  0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x73, 0x3a, 0x20, 0x6d, 0x69,
+  0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20,
+  0x28, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x6d, 0x61, 0x70, 0x70, 0x69,
+  0x6e, 0x67, 0x2b, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x29, 0x20, 0x72,
+  0x65, 0x61, 0x64, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x70, 0x65,
+  0x72, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66,
+  0x6f, 0x72, 0x3a, 0x20, 0x28, 0x31, 0x29, 0x20, 0x6e, 0x6f, 0x6e, 0x2d,
+  0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f,
+  0x74, 0x69, 0x66, 0x73, 0x2c, 0x20, 0x28, 0x32, 0x29, 0x20, 0x47, 0x54,
+  0x2f, 0x41, 0x47, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x54, 0x2f, 0x41,
+  0x43, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2c, 0x20, 0x28, 0x33, 0x29,
+  0x20, 0x47, 0x43, 0x2f, 0x41, 0x47, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43,
+  0x54, 0x2f, 0x47, 0x43, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2c, 0x20,
+  0x28, 0x34, 0x29, 0x20, 0x41, 0x54, 0x2f, 0x41, 0x43, 0x20, 0x61, 0x6e,
+  0x64, 0x20, 0x47, 0x54, 0x2f, 0x41, 0x54, 0x20, 0x6d, 0x6f, 0x74, 0x69,
+  0x66, 0x2e, 0x20, 0x2d, 0x31, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20,
+  0x6e, 0x6f, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x66, 0x6f,
+  0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4a, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6f,
+  0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x6e, 0x65,
+  0x20, 0x6f, 0x66, 0x20, 0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c,
+  0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x6e, 0x69, 0x71,
+  0x75, 0x65, 0x4d, 0x69, 0x6e, 0x20, 0x4f, 0x52, 0x20, 0x6f, 0x75, 0x74,
+  0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e,
+  0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x69, 0x6e, 0x20, 0x63, 0x6f,
+  0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x72, 0x65,
+  0x20, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x69, 0x65, 0x64, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20,
+  0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x74, 0x6f,
+  0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6a,
+  0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x6f, 0x75,
+  0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x44, 0x69, 0x73,
+  0x74, 0x54, 0x6f, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x53, 0x4a, 0x6d, 0x69,
+  0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x20, 0x20, 0x30, 0x20,
+  0x20, 0x20, 0x35, 0x20, 0x20, 0x20, 0x31, 0x30, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x34, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x73, 0x3e,
+  0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20,
+  0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x64, 0x69, 0x73, 0x74,
+  0x61, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x74, 0x68, 0x65,
+  0x72, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x27,
+  0x20, 0x64, 0x6f, 0x6e, 0x6f, 0x72, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x70,
+  0x74, 0x6f, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70,
+  0x6c, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61,
+  0x74, 0x65, 0x64, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x0a, 0x0a, 0x6f, 0x75, 0x74, 0x53, 0x4a, 0x66, 0x69, 0x6c, 0x74,
+  0x65, 0x72, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x4d, 0x61, 0x78, 0x56,
+  0x73, 0x52, 0x65, 0x61, 0x64, 0x4e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x35, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x30, 0x30, 0x30,
+  0x30, 0x30, 0x20, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x4e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x73,
+  0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d,
+  0x20, 0x67, 0x61, 0x70, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64,
+  0x20, 0x66, 0x6f, 0x72, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x73, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64,
+  0x20, 0x62, 0x79, 0x20, 0x31, 0x2c, 0x32, 0x2c, 0x33, 0x2c, 0x2c, 0x2c,
+  0x4e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x62, 0x79,
+  0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x6a, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f,
+  0x72, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x31, 0x20, 0x72, 0x65,
+  0x61, 0x64, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20,
+  0x67, 0x61, 0x70, 0x73, 0x20, 0x3c, 0x3d, 0x35, 0x30, 0x30, 0x30, 0x30,
+  0x62, 0x2c, 0x20, 0x62, 0x79, 0x20, 0x32, 0x20, 0x72, 0x65, 0x61, 0x64,
+  0x73, 0x3a, 0x20, 0x3c, 0x3d, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x62,
+  0x2c, 0x20, 0x62, 0x79, 0x20, 0x33, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73,
+  0x3a, 0x20, 0x3c, 0x3d, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2e, 0x20,
+  0x62, 0x79, 0x20, 0x3e, 0x3d, 0x34, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73,
+  0x20, 0x61, 0x6e, 0x79, 0x20, 0x67, 0x61, 0x70, 0x20, 0x3c, 0x3d, 0x61,
+  0x6c, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x4d, 0x61,
+  0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f,
+  0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79,
+  0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65,
+  0x64, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a,
+  0x0a, 0x23, 0x23, 0x23, 0x20, 0x53, 0x63, 0x6f, 0x72, 0x69, 0x6e, 0x67,
+  0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x47, 0x61, 0x70, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x3a, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x20,
+  0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x65, 0x6e,
+  0x61, 0x6c, 0x74, 0x79, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x70, 0x65,
+  0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x74,
+  0x72, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x29, 0x0a, 0x0a,
+  0x73, 0x63, 0x6f, 0x72, 0x65, 0x47, 0x61, 0x70, 0x4e, 0x6f, 0x6e, 0x63,
+  0x61, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x38, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6e,
+  0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x20,
+  0x28, 0x69, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+  0x20, 0x74, 0x6f, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x47, 0x61, 0x70,
+  0x29, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x47, 0x61, 0x70, 0x47,
+  0x43, 0x41, 0x47, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x34, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x47, 0x43, 0x2f, 0x41, 0x47, 0x20, 0x61, 0x6e, 0x64,
+  0x20, 0x43, 0x54, 0x2f, 0x47, 0x43, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74,
+  0x69, 0x6f, 0x6e, 0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x20,
+  0x28, 0x69, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+  0x20, 0x74, 0x6f, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x47, 0x61, 0x70,
+  0x29, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x47, 0x61, 0x70, 0x41,
+  0x54, 0x41, 0x43, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x38, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x41, 0x54, 0x2f, 0x41, 0x43, 0x20, 0x20, 0x61, 0x6e,
+  0x64, 0x20, 0x47, 0x54, 0x2f, 0x41, 0x54, 0x20, 0x6a, 0x75, 0x6e, 0x63,
+  0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79,
+  0x20, 0x20, 0x28, 0x69, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x47,
+  0x61, 0x70, 0x29, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x47, 0x65,
+  0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4c,
+  0x6f, 0x67, 0x32, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x20, 0x20, 0x2d,
+  0x30, 0x2e, 0x32, 0x35, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x74,
+  0x72, 0x61, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x67,
+  0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79,
+  0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68,
+  0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x20, 0x6c, 0x65, 0x6e,
+  0x67, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61,
+  0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x73, 0x63,
+  0x6f, 0x72, 0x65, 0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x4c, 0x65,
+  0x6e, 0x67, 0x74, 0x68, 0x4c, 0x6f, 0x67, 0x32, 0x73, 0x63, 0x61, 0x6c,
+  0x65, 0x2a, 0x6c, 0x6f, 0x67, 0x32, 0x28, 0x67, 0x65, 0x6e, 0x6f, 0x6d,
+  0x69, 0x63, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x0a, 0x0a, 0x73,
+  0x63, 0x6f, 0x72, 0x65, 0x44, 0x65, 0x6c, 0x4f, 0x70, 0x65, 0x6e, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x2d, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64,
+  0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x6e,
+  0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x0a, 0x0a, 0x73, 0x63,
+  0x6f, 0x72, 0x65, 0x44, 0x65, 0x6c, 0x42, 0x61, 0x73, 0x65, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x2d, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65,
+  0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e,
+  0x73, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79,
+  0x20, 0x70, 0x65, 0x72, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x28, 0x69,
+  0x6e, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74,
+  0x6f, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x44, 0x65, 0x6c, 0x4f, 0x70,
+  0x65, 0x6e, 0x29, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x49, 0x6e,
+  0x73, 0x4f, 0x70, 0x65, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x32,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x70, 0x65, 0x6e, 0x61,
+  0x6c, 0x74, 0x79, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x49, 0x6e,
+  0x73, 0x42, 0x61, 0x73, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x32,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x69,
+  0x6f, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+  0x20, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x20, 0x70, 0x65, 0x72,
+  0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x28, 0x69, 0x6e, 0x20, 0x61, 0x64,
+  0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x63,
+  0x6f, 0x72, 0x65, 0x49, 0x6e, 0x73, 0x4f, 0x70, 0x65, 0x6e, 0x29, 0x0a,
+  0x0a, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x69, 0x74, 0x63, 0x68,
+  0x53, 0x4a, 0x73, 0x68, 0x69, 0x66, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x73, 0x63, 0x6f, 0x72,
+  0x65, 0x20, 0x72, 0x65, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+  0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68,
+  0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x53, 0x4a, 0x20, 0x62,
+  0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x69, 0x65, 0x73, 0x20, 0x69, 0x6e,
+  0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x69, 0x74, 0x63, 0x68, 0x69, 0x6e,
+  0x67, 0x20, 0x73, 0x74, 0x65, 0x70, 0x0a, 0x0a, 0x0a, 0x23, 0x23, 0x23,
+  0x20, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20,
+  0x61, 0x6e, 0x64, 0x20, 0x53, 0x65, 0x65, 0x64, 0x69, 0x6e, 0x67, 0x0a,
+  0x0a, 0x73, 0x65, 0x65, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53,
+  0x74, 0x61, 0x72, 0x74, 0x4c, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x35, 0x30, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x64,
+  0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
+  0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20,
+  0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67,
+  0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x2d,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x69, 0x73,
+  0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20,
+  0x70, 0x69, 0x65, 0x63, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x6c, 0x6f,
+  0x6e, 0x67, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68,
+  0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x0a, 0x73, 0x65,
+  0x65, 0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72,
+  0x74, 0x4c, 0x6d, 0x61, 0x78, 0x4f, 0x76, 0x65, 0x72, 0x4c, 0x72, 0x65,
+  0x61, 0x64, 0x20, 0x20, 0x20, 0x20, 0x31, 0x2e, 0x30, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x20, 0x73, 0x65, 0x65,
+  0x64, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74,
+  0x4c, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69,
+  0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20,
+  0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x28, 0x73, 0x75, 0x6d, 0x20,
+  0x6f, 0x66, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x73, 0x27, 0x20, 0x6c, 0x65,
+  0x6e, 0x67, 0x74, 0x68, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61,
+  0x69, 0x72, 0x65, 0x64, 0x2d, 0x65, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x61,
+  0x64, 0x73, 0x29, 0x0a, 0x0a, 0x73, 0x65, 0x65, 0x64, 0x53, 0x65, 0x61,
+  0x72, 0x63, 0x68, 0x4c, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e,
+  0x3d, 0x30, 0x3a, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20,
+  0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x73, 0x65, 0x65, 0x64, 0x73, 0x2c, 0x20, 0x69, 0x66, 0x20,
+  0x3d, 0x30, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x73, 0x65, 0x65, 0x64, 0x20,
+  0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x66,
+  0x69, 0x6e, 0x69, 0x74, 0x65, 0x0a, 0x0a, 0x73, 0x65, 0x65, 0x64, 0x4d,
+  0x75, 0x6c, 0x74, 0x69, 0x6d, 0x61, 0x70, 0x4e, 0x6d, 0x61, 0x78, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x20,
+  0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6f, 0x6e,
+  0x6c, 0x79, 0x20, 0x70, 0x69, 0x65, 0x63, 0x65, 0x73, 0x20, 0x74, 0x68,
+  0x61, 0x74, 0x20, 0x6d, 0x61, 0x70, 0x20, 0x66, 0x65, 0x77, 0x65, 0x72,
+  0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76,
+  0x61, 0x6c, 0x75, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x75, 0x74, 0x69,
+  0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x73, 0x74, 0x69, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x70,
+  0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x0a, 0x0a, 0x73, 0x65,
+  0x65, 0x64, 0x50, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x4e, 0x6d, 0x61,
+  0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x30, 0x30,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20,
+  0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f,
+  0x66, 0x20, 0x73, 0x65, 0x65, 0x64, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20,
+  0x72, 0x65, 0x61, 0x64, 0x0a, 0x0a, 0x73, 0x65, 0x65, 0x64, 0x50, 0x65,
+  0x72, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4e, 0x6d, 0x61, 0x78, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x35, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75,
+  0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x65, 0x64,
+  0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77,
+  0x0a, 0x0a, 0x73, 0x65, 0x65, 0x64, 0x4e, 0x6f, 0x6e, 0x65, 0x4c, 0x6f,
+  0x63, 0x69, 0x50, 0x65, 0x72, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x20,
+  0x20, 0x20, 0x20, 0x31, 0x30, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75,
+  0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20,
+  0x73, 0x65, 0x65, 0x64, 0x20, 0x6c, 0x6f, 0x63, 0x69, 0x20, 0x70, 0x65,
+  0x72, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x0a, 0x0a, 0x61, 0x6c,
+  0x69, 0x67, 0x6e, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x4d, 0x69, 0x6e,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x32, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x6e,
+  0x69, 0x6d, 0x75, 0x6d, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x20,
+  0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x69,
+  0x63, 0x20, 0x67, 0x61, 0x70, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e,
+  0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x72,
+  0x6f, 0x6e, 0x20, 0x69, 0x66, 0x20, 0x69, 0x74, 0x73, 0x20, 0x6c, 0x65,
+  0x6e, 0x67, 0x74, 0x68, 0x3e, 0x3d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x49,
+  0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x4d, 0x69, 0x6e, 0x2c, 0x20, 0x6f, 0x74,
+  0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x20, 0x69, 0x74, 0x20, 0x69,
+  0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64,
+  0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x0a, 0x61,
+  0x6c, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x4d, 0x61,
+  0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78,
+  0x69, 0x6d, 0x75, 0x6d, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x20,
+  0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x30, 0x2c, 0x20,
+  0x6d, 0x61, 0x78, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x20, 0x73,
+  0x69, 0x7a, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20,
+  0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x62,
+  0x79, 0x20, 0x28, 0x32, 0x5e, 0x77, 0x69, 0x6e, 0x42, 0x69, 0x6e, 0x4e,
+  0x62, 0x69, 0x74, 0x73, 0x29, 0x2a, 0x77, 0x69, 0x6e, 0x41, 0x6e, 0x63,
+  0x68, 0x6f, 0x72, 0x44, 0x69, 0x73, 0x74, 0x4e, 0x62, 0x69, 0x6e, 0x73,
+  0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x4d, 0x61, 0x74, 0x65, 0x73,
+  0x47, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x67, 0x61, 0x70, 0x20,
+  0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x77, 0x6f, 0x20,
+  0x6d, 0x61, 0x74, 0x65, 0x73, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x30, 0x2c,
+  0x20, 0x6d, 0x61, 0x78, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x6e, 0x20,
+  0x67, 0x61, 0x70, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20,
+  0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x62,
+  0x79, 0x20, 0x28, 0x32, 0x5e, 0x77, 0x69, 0x6e, 0x42, 0x69, 0x6e, 0x4e,
+  0x62, 0x69, 0x74, 0x73, 0x29, 0x2a, 0x77, 0x69, 0x6e, 0x41, 0x6e, 0x63,
+  0x68, 0x6f, 0x72, 0x44, 0x69, 0x73, 0x74, 0x4e, 0x62, 0x69, 0x6e, 0x73,
+  0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x53, 0x4a, 0x6f, 0x76, 0x65,
+  0x72, 0x68, 0x61, 0x6e, 0x67, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x35, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d,
+  0x75, 0x6d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x61, 0x6e, 0x67, 0x20,
+  0x28, 0x69, 0x2e, 0x65, 0x2e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20,
+  0x73, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x70,
+  0x6c, 0x69, 0x63, 0x65, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d,
+  0x65, 0x6e, 0x74, 0x73, 0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x53,
+  0x4a, 0x73, 0x74, 0x69, 0x74, 0x63, 0x68, 0x4d, 0x69, 0x73, 0x6d, 0x61,
+  0x74, 0x63, 0x68, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x30, 0x20,
+  0x2d, 0x31, 0x20, 0x30, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34,
+  0x2a, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78,
+  0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20,
+  0x6f, 0x66, 0x20, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65,
+  0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x69, 0x74, 0x63, 0x68,
+  0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
+  0x70, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69,
+  0x6f, 0x6e, 0x73, 0x20, 0x28, 0x2d, 0x31, 0x3a, 0x20, 0x6e, 0x6f, 0x20,
+  0x6c, 0x69, 0x6d, 0x69, 0x74, 0x29, 0x2e, 0x20, 0x0a, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x28, 0x31, 0x29, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x63, 0x61, 0x6e,
+  0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66,
+  0x73, 0x2c, 0x20, 0x28, 0x32, 0x29, 0x20, 0x47, 0x54, 0x2f, 0x41, 0x47,
+  0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x54, 0x2f, 0x41, 0x43, 0x20, 0x6d,
+  0x6f, 0x74, 0x69, 0x66, 0x2c, 0x20, 0x28, 0x33, 0x29, 0x20, 0x47, 0x43,
+  0x2f, 0x41, 0x47, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x43, 0x54, 0x2f, 0x47,
+  0x43, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2c, 0x20, 0x28, 0x34, 0x29,
+  0x20, 0x41, 0x54, 0x2f, 0x41, 0x43, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47,
+  0x54, 0x2f, 0x41, 0x54, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x66, 0x2e, 0x0a,
+  0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x53, 0x4a, 0x44, 0x42, 0x6f, 0x76,
+  0x65, 0x72, 0x68, 0x61, 0x6e, 0x67, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x33, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75,
+  0x6d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x68, 0x61, 0x6e, 0x67, 0x20, 0x28,
+  0x69, 0x2e, 0x65, 0x2e, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x73,
+  0x69, 0x7a, 0x65, 0x29, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x6e,
+  0x6f, 0x74, 0x61, 0x74, 0x65, 0x64, 0x20, 0x28, 0x73, 0x6a, 0x64, 0x62,
+  0x29, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x20, 0x61, 0x6c,
+  0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x0a, 0x61, 0x6c,
+  0x69, 0x67, 0x6e, 0x53, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x4d, 0x61,
+  0x74, 0x65, 0x4d, 0x61, 0x70, 0x4c, 0x6d, 0x69, 0x6e, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e,
+  0x30, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6d,
+  0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
+  0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20,
+  0x6d, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73,
+  0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x0a, 0x0a, 0x61, 0x6c,
+  0x69, 0x67, 0x6e, 0x53, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x64, 0x4d, 0x61,
+  0x74, 0x65, 0x4d, 0x61, 0x70, 0x4c, 0x6d, 0x69, 0x6e, 0x4f, 0x76, 0x65,
+  0x72, 0x4c, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x30, 0x2e, 0x36, 0x36, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3e, 0x30, 0x3a,
+  0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x53, 0x70, 0x6c, 0x69, 0x63, 0x65,
+  0x64, 0x4d, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x70, 0x4c, 0x6d, 0x69, 0x6e,
+  0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x20,
+  0x74, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x6c, 0x65, 0x6e, 0x67,
+  0x74, 0x68, 0x0a, 0x20, 0x20, 0x20, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+  0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x50, 0x65, 0x72, 0x52, 0x65,
+  0x61, 0x64, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31,
+  0x30, 0x30, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74,
+  0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62,
+  0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77,
+  0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x72, 0x65, 0x61, 0x64, 0x0a, 0x0a,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72,
+  0x69, 0x70, 0x74, 0x73, 0x50, 0x65, 0x72, 0x57, 0x69, 0x6e, 0x64, 0x6f,
+  0x77, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x31, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e,
+  0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65,
+  0x72, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72,
+  0x69, 0x70, 0x74, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x77, 0x69, 0x6e,
+  0x64, 0x6f, 0x77, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x54, 0x72, 0x61,
+  0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x73, 0x50, 0x65, 0x72, 0x52,
+  0x65, 0x61, 0x64, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30,
+  0x30, 0x30, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e,
+  0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65,
+  0x72, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65,
+  0x6e, 0x74, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+  0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x74,
+  0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x0a, 0x0a,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x45, 0x6e, 0x64, 0x73, 0x54, 0x79, 0x70,
+  0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74,
+  0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f,
+  0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20,
+  0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f,
+  0x63, 0x61, 0x6c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61,
+  0x72, 0x64, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6c, 0x69,
+  0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20,
+  0x73, 0x6f, 0x66, 0x74, 0x2d, 0x63, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e,
+  0x67, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x45, 0x6e,
+  0x64, 0x54, 0x6f, 0x45, 0x6e, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x20,
+  0x65, 0x6e, 0x64, 0x2d, 0x74, 0x6f, 0x2d, 0x65, 0x6e, 0x64, 0x20, 0x72,
+  0x65, 0x61, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
+  0x74, 0x2c, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x6f,
+  0x66, 0x74, 0x2d, 0x63, 0x6c, 0x69, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x45, 0x78, 0x74, 0x65,
+  0x6e, 0x64, 0x35, 0x70, 0x4f, 0x66, 0x52, 0x65, 0x61, 0x64, 0x31, 0x20,
+  0x2e, 0x2e, 0x2e, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78,
+  0x74, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x35, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x72, 0x65, 0x61, 0x64, 0x31, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f,
+  0x74, 0x68, 0x65, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x3a, 0x20, 0x6c,
+  0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65,
+  0x6e, 0x74, 0x0a, 0x0a, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x53, 0x6f, 0x66,
+  0x74, 0x43, 0x6c, 0x69, 0x70, 0x41, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72,
+  0x65, 0x6e, 0x63, 0x65, 0x45, 0x6e, 0x64, 0x73, 0x20, 0x59, 0x65, 0x73,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a,
+  0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
+  0x6f, 0x66, 0x74, 0x2d, 0x63, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6c, 0x69, 0x67,
+  0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x70, 0x61, 0x73, 0x74, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x6f, 0x73, 0x6f, 0x6d,
+  0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x59, 0x65, 0x73, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x61,
+  0x6c, 0x6c, 0x6f, 0x77, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x20, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x70, 0x72, 0x6f, 0x68, 0x69, 0x62, 0x69, 0x74, 0x2c, 0x20, 0x75,
+  0x73, 0x65, 0x66, 0x75, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f,
+  0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20,
+  0x77, 0x69, 0x74, 0x68, 0x20, 0x43, 0x75, 0x66, 0x66, 0x6c, 0x69, 0x6e,
+  0x6b, 0x73, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x57, 0x69, 0x6e, 0x64,
+  0x6f, 0x77, 0x73, 0x2c, 0x20, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x73,
+  0x2c, 0x20, 0x42, 0x69, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x0a, 0x0a, 0x77,
+  0x69, 0x6e, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x4d, 0x75, 0x6c, 0x74,
+  0x69, 0x6d, 0x61, 0x70, 0x4e, 0x6d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x35, 0x30, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78,
+  0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c,
+  0x6f, 0x63, 0x69, 0x20, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x20,
+  0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20,
+  0x74, 0x6f, 0x20, 0x6d, 0x61, 0x70, 0x20, 0x74, 0x6f, 0x0a, 0x0a, 0x77,
+  0x69, 0x6e, 0x42, 0x69, 0x6e, 0x4e, 0x62, 0x69, 0x74, 0x73, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x36, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x3d, 0x6c, 0x6f,
+  0x67, 0x32, 0x28, 0x77, 0x69, 0x6e, 0x42, 0x69, 0x6e, 0x29, 0x2c, 0x20,
+  0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x77, 0x69, 0x6e, 0x42, 0x69, 0x6e,
+  0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65,
+  0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x6e, 0x20,
+  0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x69, 0x6e, 0x64,
+  0x6f, 0x77, 0x73, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69,
+  0x6e, 0x67, 0x2c, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x77, 0x69, 0x6e,
+  0x64, 0x6f, 0x77, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6f, 0x63, 0x63,
+  0x75, 0x70, 0x79, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67,
+  0x65, 0x72, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66,
+  0x20, 0x62, 0x69, 0x6e, 0x73, 0x2e, 0x20, 0x0a, 0x0a, 0x77, 0x69, 0x6e,
+  0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x44, 0x69, 0x73, 0x74, 0x4e, 0x62,
+  0x69, 0x6e, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x39, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x6e, 0x75,
+  0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x6e, 0x73,
+  0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x74, 0x77, 0x6f,
+  0x20, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x20, 0x74, 0x68, 0x61,
+  0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x61, 0x67, 0x67,
+  0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20,
+  0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x74, 0x6f,
+  0x20, 0x6f, 0x6e, 0x65, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x0a,
+  0x0a, 0x77, 0x69, 0x6e, 0x46, 0x6c, 0x61, 0x6e, 0x6b, 0x4e, 0x62, 0x69,
+  0x6e, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x34, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69,
+  0x6e, 0x74, 0x3e, 0x30, 0x3a, 0x20, 0x6c, 0x6f, 0x67, 0x32, 0x28, 0x77,
+  0x69, 0x6e, 0x46, 0x6c, 0x61, 0x6e, 0x6b, 0x29, 0x2c, 0x20, 0x77, 0x68,
+  0x65, 0x72, 0x65, 0x20, 0x77, 0x69, 0x6e, 0x20, 0x46, 0x6c, 0x61, 0x6e,
+  0x6b, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x7a,
+  0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x66,
+  0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20,
+  0x66, 0x6c, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x67,
+  0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63,
+  0x68, 0x20, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x0a, 0x0a, 0x0a, 0x0a,
+  0x23, 0x23, 0x23, 0x20, 0x43, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63,
+  0x20, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a,
+  0x63, 0x68, 0x69, 0x6d, 0x4f, 0x75, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65,
+  0x53, 0x41, 0x4d, 0x6f, 0x6c, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73,
+  0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20,
+  0x6f, 0x66, 0x20, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20,
+  0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53,
+  0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x53, 0x41, 0x4d, 0x6f, 0x6c,
+  0x64, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75,
+  0x74, 0x20, 0x6f, 0x6c, 0x64, 0x20, 0x53, 0x41, 0x4d, 0x20, 0x69, 0x6e,
+  0x74, 0x6f, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x20,
+  0x43, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x2e, 0x6f, 0x75, 0x74,
+  0x2e, 0x73, 0x61, 0x6d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x57, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x42, 0x41, 0x4d, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6f, 0x75,
+  0x74, 0x70, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x6d, 0x61,
+  0x69, 0x6e, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x42,
+  0x41, 0x4d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x28, 0x41, 0x6c,
+  0x69, 0x67, 0x6e, 0x65, 0x64, 0x2e, 0x2a, 0x2e, 0x62, 0x61, 0x6d, 0x29,
+  0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e,
+  0x74, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69,
+  0x6d, 0x75, 0x6d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x6f,
+  0x66, 0x20, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73,
+  0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74,
+  0x68, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x3d, 0x3d, 0x30, 0x2c, 0x20, 0x6e,
+  0x6f, 0x20, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x6f,
+  0x75, 0x74, 0x70, 0x75, 0x74, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d, 0x53,
+  0x63, 0x6f, 0x72, 0x65, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30,
+  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a,
+  0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x74, 0x6f, 0x74,
+  0x61, 0x6c, 0x20, 0x28, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x29, 0x20,
+  0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x65,
+  0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d,
+  0x53, 0x63, 0x6f, 0x72, 0x65, 0x44, 0x72, 0x6f, 0x70, 0x4d, 0x61, 0x78,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x32, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d,
+  0x30, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x20,
+  0x28, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x29,
+  0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63,
+  0x20, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x28, 0x74, 0x68, 0x65, 0x20,
+  0x73, 0x75, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x63, 0x6f, 0x72, 0x65,
+  0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x68, 0x69,
+  0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x65, 0x67, 0x65, 0x6d, 0x65,
+  0x6e, 0x74, 0x73, 0x29, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74,
+  0x68, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65,
+  0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x30, 0x0a, 0x20, 0x20,
+  0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30, 0x3a, 0x20, 0x6d, 0x69,
+  0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72,
+  0x65, 0x6e, 0x63, 0x65, 0x20, 0x28, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61,
+  0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65,
+  0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x63,
+  0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x73, 0x63, 0x6f, 0x72,
+  0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65,
+  0x78, 0x74, 0x20, 0x6f, 0x6e, 0x65, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d,
+  0x53, 0x63, 0x6f, 0x72, 0x65, 0x4a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
+  0x6e, 0x4e, 0x6f, 0x6e, 0x47, 0x54, 0x41, 0x47, 0x20, 0x20, 0x20, 0x20,
+  0x2d, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20,
+  0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20,
+  0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x47, 0x54, 0x2f, 0x41, 0x47, 0x20,
+  0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x6a, 0x75, 0x6e,
+  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d, 0x4a,
+  0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x76, 0x65, 0x72, 0x68,
+  0x61, 0x6e, 0x67, 0x4d, 0x69, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x32,
+  0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30,
+  0x3a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6f, 0x76,
+  0x65, 0x72, 0x68, 0x61, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61,
+  0x20, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x6a, 0x75,
+  0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d,
+  0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x61, 0x64, 0x47,
+  0x61, 0x70, 0x4d, 0x61, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3e, 0x3d, 0x30,
+  0x3a, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x67, 0x61,
+  0x70, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61,
+  0x64, 0x20, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x62,
+  0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x63, 0x68, 0x69, 0x6d, 0x65,
+  0x72, 0x69, 0x63, 0x20, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+  0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6d, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x6e, 0x47, 0x65, 0x6e,
+  0x6f, 0x6d, 0x69, 0x63, 0x4e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74,
+  0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x64, 0x69, 0x66,
+  0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65,
+  0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x69, 0x6d, 0x65,
+  0x72, 0x69, 0x63, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
+  0x74, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x20,
+  0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65,
+  0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x6e,
+  0x47, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x4e, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x4e, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20,
+  0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x73, 0x65,
+  0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x72, 0x6f, 0x75, 0x6e,
+  0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x69, 0x6d, 0x65, 0x72,
+  0x69, 0x63, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a,
+  0x0a, 0x23, 0x23, 0x23, 0x20, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x66,
+  0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x41,
+  0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x71,
+  0x75, 0x61, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x2d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72,
+  0x69, 0x6e, 0x67, 0x28, 0x73, 0x29, 0x3a, 0x20, 0x74, 0x79, 0x70, 0x65,
+  0x73, 0x20, 0x6f, 0x66, 0x20, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x66,
+  0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75,
+  0x65, 0x73, 0x74, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69,
+  0x70, 0x74, 0x6f, 0x6d, 0x65, 0x53, 0x41, 0x4d, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x53, 0x41, 0x4d, 0x2f,
+  0x42, 0x41, 0x4d, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
+  0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x63,
+  0x72, 0x69, 0x70, 0x74, 0x6f, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x6f,
+  0x20, 0x61, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x20,
+  0x66, 0x69, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x47, 0x65, 0x6e,
+  0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20,
+  0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x67, 0x65,
+  0x6e, 0x65, 0x0a, 0x0a, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x54, 0x72, 0x61,
+  0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x6d, 0x65, 0x42, 0x41,
+  0x4d, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+  0x20, 0x20, 0x20, 0x20, 0x31, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x3a, 0x20, 0x2d,
+  0x31, 0x20, 0x74, 0x6f, 0x20, 0x31, 0x30, 0x20, 0x20, 0x74, 0x72, 0x61,
+  0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x6d, 0x65, 0x20, 0x42,
+  0x41, 0x4d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69,
+  0x6f, 0x6e, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2c, 0x20, 0x2d, 0x31,
+  0x3d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x6f, 0x6d,
+  0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x36, 0x3f,
+  0x29, 0x2c, 0x20, 0x30, 0x3d, 0x6e, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70,
+  0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x31, 0x30, 0x3d,
+  0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x63, 0x6f, 0x6d, 0x70,
+  0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x0a, 0x71, 0x75, 0x61,
+  0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
+  0x6f, 0x6d, 0x65, 0x42, 0x61, 0x6e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x49, 0x6e, 0x64, 0x65, 0x6c, 0x53, 0x6f, 0x66, 0x74, 0x63, 0x6c,
+  0x69, 0x70, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x65, 0x6e, 0x64, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20,
+  0x70, 0x72, 0x6f, 0x68, 0x69, 0x62, 0x69, 0x74, 0x20, 0x76, 0x61, 0x72,
+  0x69, 0x6f, 0x75, 0x73, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65,
+  0x6e, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x49, 0x6e, 0x64, 0x65, 0x6c, 0x53, 0x6f, 0x66, 0x74, 0x63, 0x6c, 0x69,
+  0x70, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x65, 0x6e, 0x64, 0x20, 0x20,
+  0x2e, 0x2e, 0x2e, 0x20, 0x70, 0x72, 0x6f, 0x68, 0x69, 0x62, 0x69, 0x74,
+  0x20, 0x69, 0x6e, 0x64, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x73, 0x6f, 0x66,
+  0x74, 0x20, 0x63, 0x6c, 0x69, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x61,
+  0x6e, 0x64, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x2d, 0x65, 0x6e,
+  0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73,
+  0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c,
+  0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x52, 0x53, 0x45, 0x4d, 0x0a,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x65, 0x6e,
+  0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20, 0x70, 0x72, 0x6f, 0x68,
+  0x69, 0x62, 0x69, 0x74, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x2d,
+  0x65, 0x6e, 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
+  0x74, 0x73, 0x0a, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x32, 0x2d, 0x70, 0x61,
+  0x73, 0x73, 0x20, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x0a, 0x74,
+  0x77, 0x6f, 0x70, 0x61, 0x73, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20,
+  0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x32, 0x2d, 0x70, 0x61,
+  0x73, 0x73, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x6d,
+  0x6f, 0x64, 0x65, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x6e,
+  0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e,
+  0x20, 0x31, 0x2d, 0x70, 0x61, 0x73, 0x73, 0x20, 0x6d, 0x61, 0x70, 0x70,
+  0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x42, 0x61, 0x73, 0x69,
+  0x63, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x20,
+  0x62, 0x61, 0x73, 0x69, 0x63, 0x20, 0x32, 0x2d, 0x70, 0x61, 0x73, 0x73,
+  0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x77, 0x69,
+  0x74, 0x68, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x31, 0x73, 0x74, 0x20, 0x70,
+  0x61, 0x73, 0x73, 0x20, 0x6a, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x65, 0x64, 0x20, 0x69,
+  0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x6f,
+  0x6d, 0x65, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x20, 0x6f,
+  0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6c, 0x79, 0x0a, 0x0a, 0x74,
+  0x77, 0x6f, 0x70, 0x61, 0x73, 0x73, 0x31, 0x72, 0x65, 0x61, 0x64, 0x73,
+  0x4e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+  0x20, 0x20, 0x20, 0x2d, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e,
+  0x74, 0x3a, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66,
+  0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72,
+  0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x31, 0x73, 0x74, 0x20, 0x73, 0x74, 0x65, 0x70, 0x2e, 0x20,
+  0x55, 0x73, 0x65, 0x20, 0x76, 0x65, 0x72, 0x79, 0x20, 0x6c, 0x61, 0x72,
+  0x67, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x28, 0x6f,
+  0x72, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x2d, 0x31,
+  0x29, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x70, 0x20, 0x61, 0x6c, 0x6c,
+  0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x73, 0x74, 0x65, 0x70,
+  0x2e, 0x0a, 0x0a
+};
+unsigned int parametersDefault_len = 27615;
diff --git a/source/readLoad.cpp b/source/readLoad.cpp
index a8ca2a9..a86d4c1 100644
--- a/source/readLoad.cpp
+++ b/source/readLoad.cpp
@@ -142,10 +142,10 @@ int readLoad(istream& readInStream, Parameters* P, uint iMate, uint& Lread, uint
     
 
     //trim read name
-    char* pSlash=strchr(readName,' '); //trim everything after ' '
-    if (pSlash!=NULL) *pSlash=0;                
-    pSlash=strchr(readName,'/'); //trim everything after /
-    if (pSlash!=NULL) *pSlash=0;    
-    
+    for (uint ii=0; ii<P->readNameSeparatorChar.size(); ii++)
+    {
+        char* pSlash=strchr(readName,P->readNameSeparatorChar.at(ii)); //trim everything after ' '
+        if (pSlash!=NULL) *pSlash=0;                
+    };
     return readFileType;
 };
diff --git a/source/serviceFuns.cpp b/source/serviceFuns.cpp
index c68825d..6e83e89 100644
--- a/source/serviceFuns.cpp
+++ b/source/serviceFuns.cpp
@@ -1,6 +1,8 @@
 #ifndef DEF_serviceFuns
 #define DEF_serviceFuns
 
+#include "IncludeDefine.h"
+
 template <class T>
     T sum1D(T* a, uint N) {
         T s=0;
diff --git a/source/sjSplitAlign.cpp b/source/sjSplitAlign.cpp
index 53d7f5b..48a4fe5 100644
--- a/source/sjSplitAlign.cpp
+++ b/source/sjSplitAlign.cpp
@@ -1,3 +1,6 @@
+#include "IncludeDefine.h"                                                                                                                                                     
+#include "Parameters.h"
+
 bool sjAlignSplit(uint a1,uint aLength,Parameters* P, uint &a1D, uint &aLengthD, uint &a1A, uint &aLengthA, uint &isj) {
     uint sj1=(a1-P->sjGstart)%P->sjdbLength;
     if (sj1<P->sjdbOverhang && sj1+aLength>P->sjdbOverhang) {//align crosses the junctions
diff --git a/source/sjdbBuildIndex.cpp b/source/sjdbBuildIndex.cpp
index def6d2c..c63b280 100644
--- a/source/sjdbBuildIndex.cpp
+++ b/source/sjdbBuildIndex.cpp
@@ -11,49 +11,7 @@
 #include "ErrorWarning.h"
 #include <cmath>
 
-char* globalGsj;
-
-
-inline int funCompareUintAndSuffixes ( const void *a, const void *b){
-    uint va= *((uint*) a);
-    uint vb= *((uint*) b);
-
-    if (va>vb) {
-            return 1;
-        } else if (va<vb) {
-            return -1;
-        } else {//compare suffixes
-            char* ga=globalGsj + *( ((uint*) a)+1);
-            char* gb=globalGsj + *( ((uint*) b)+1);
-            int ig=0;
-            while (true) {
-                if (ga[ig]>gb[ig]) { // second condition: reached the end of ga, it's >= than any character, but = does not matter
-                    return 1;
-                } else if (ga[ig]<gb[ig]) {
-                    return -1;
-//                 } else if (ga[ig]==5) {
-//                     return 0;
-                } else {
-                    ig++;
-                };
-            };
-        };
-};
-
-inline int64 funCalcSAi(char* G, uint iL) {
-    int64 ind1=0;
-    for (uint iL1=0;iL1<=iL;iL1++) {
-        uint g=(uint) G[iL1];
-        if (g>3) {
-            return -ind1;
-        } else {
-            ind1 <<= 2;
-            ind1 += g;
-        };
-   };
-   return ind1;
-};
-
+#include "funCompareUintAndSuffixes.h"
 
 void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedArray &SA, PackedArray &SA2, PackedArray &SAi) {
     
@@ -74,7 +32,7 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
     {
         Gsj[ii*P->sjdbLength-1]=SPACER_CHAR; //to make sure this is > than any genome char
     };
-    Gsj[nGsj*2]=SPACER_CHAR+1;//mark the end of the text
+    Gsj[nGsj*2]=SPACER_CHAR;//mark the end of the text
 
     for (uint ii=0; ii<nGsj; ii++) {//reverse complement junction sequences
         Gsj[nGsj*2-1-ii]=Gsj[ii]<4 ? 3-Gsj[ii] : Gsj[ii]; //reverse complement
@@ -119,12 +77,11 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
             } else 
             {
                 //indArray[ind1] =  suffixArraySearch(seq1, istart, P->sjdbLength-istart1, G, SA, true, 0, P->nSA-1, 0, P) ;
-                indArray[ind1] =  suffixArraySearch(seq1, istart, 10000, G, SA, true, 0, P->nSA-1, 0, P) ;
+                indArray[ind1] =  suffixArraySearch1(seq1, istart, 10000, G, -1LLU, SA, true, 0, P->nSA-1, 0, P) ;
                 indArray[ind1+1] = isj*P->sjdbLength+istart;
             };
         };
     };
-//     for (int ii=0;ii<P1->sjdbN;ii++) {if ( oldSJind[ii]==0){cout <<ii<<endl;};};
     sjNew = sjNew/2;//novel junctions were double counted on two strands
     
     time ( &rawtime );
@@ -139,7 +96,7 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
         };
     };
 
-    globalGsj=Gsj;
+    globalGenomeArray=Gsj;
     qsort((void*) indArray, nInd, 2*sizeof(uint64), funCompareUintAndSuffixes);
     time ( &rawtime );
     P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished sorting SA indicesL nInd="<<nInd <<endl;
@@ -166,29 +123,35 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
     uint N2bit= 1LLU << P->GstrandBit;
     uint strandMask=~N2bit;
     
-    //testing
-//     PackedArray SAo;
-//     SAo.defineBits(P->GstrandBit+1,P->nSA);
-//     SAo.allocateArray();
-//     ifstream oldSAin("./DirTrue/SA");
-//     oldSAin.read(SAo.charArray,SAo.lengthByte);
-//     oldSAin.close();
-    
+    /*testing
+    PackedArray SAo;
+    SAo.defineBits(P->GstrandBit+1,P->nSA);
+    SAo.allocateArray();
+    ifstream oldSAin("./DirTrue/SA");
+    oldSAin.read(SAo.charArray,SAo.lengthByte);
+    oldSAin.close();
+    */
     
     uint isj=0, isa2=0;
-    for (uint isa=0;isa<P1->nSA;isa++) {
-        //testing
-//         if (isa2>0 && SA2[isa2-1]!=SAo[isa2-1]) {
-//             cout <<isa2 <<" "<< SA2[isa2-1]<<" "<<SAo[isa2-1]<<endl;
-//         };        
-
-//         if (isa==69789089)
-//      	{ 
-//           cout <<isa;
-//         };
-
-        uint ind1=SA[isa];
+    for (uint isa=0;isa<P1->nSA;isa++) {   
+        while (isa==indArray[isj*2]) {//insert sj index before the existing index
+            uint ind1=indArray[isj*2+1];
+            if (ind1<nGsj) {
+                ind1+=P->chrStart[P->nChrReal];
+            } else {//reverse strand
+                ind1=(ind1-nGsj) | N2bit;
+            };
+            SA2.writePacked(isa2,ind1);
+            /*testing
+            if (SA2[isa2]!=SAo[isa2]) {
+               cout <<isa2 <<" "<< SA2[isa2]<<" "<<SAo[isa2]<<endl;
+               //sleep(100);
+            };
+            */                  
+            ++isa2; ++isj;
+        };
         
+        uint ind1=SA[isa];       
         if ( (ind1 & N2bit)>0 ) 
         {//- strand
             uint ind1s = P1->nGenome - (ind1 & strandMask);
@@ -210,20 +173,33 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
             };
         };
         
-        SA2.writePacked(isa2,ind1); //TODO make sure that the first sj index is not before the first array index
-        ++isa2;
-        
-        while (isa==indArray[isj*2]) {//insert sj index after the existing index
-            uint ind1=indArray[isj*2+1];
-            if (ind1<nGsj) {
-                ind1+=P->chrStart[P->nChrReal];
-            } else {//reverse strand
-                ind1=(ind1-nGsj) | N2bit;
+        SA2.writePacked(isa2,ind1);
+            /*testing
+            if (SA2[isa2]!=SAo[isa2]) {
+               cout <<isa2 <<" "<< SA2[isa2]<<" "<<SAo[isa2]<<endl;
+               //sleep(100);
             };
-            SA2.writePacked(isa2,ind1);
-            ++isa2; ++isj;
-        };
+            */         
+        ++isa2;
     };
+    
+    for (;isj<nInd;isj++) {//insert last new indices after the last old index
+        uint ind1=indArray[isj*2+1];
+        if (ind1<nGsj) {
+            ind1+=P->chrStart[P->nChrReal];
+        } else {//reverse strand
+            ind1=(ind1-nGsj) | N2bit;
+        };
+        SA2.writePacked(isa2,ind1);
+            /*testing
+            if (SA2[isa2]!=SAo[isa2]) {
+               cout <<isa2 <<" "<< SA2[isa2]<<" "<<SAo[isa2]<<endl;
+               //sleep(100);
+            };
+            */          
+        ++isa2;
+    };    
+
     time ( &rawtime );
     P->inOut->logMain  << timeMonthDayTime(rawtime) << "   Finished inserting junction indices" <<endl;
     
@@ -239,14 +215,14 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
             {//index missing from the old genome
                 uint iSJ1=iSJ;
                 int64 ind1=funCalcSAi(Gsj+indArray[2*iSJ+1],iL);
-                while (ind1 < (int64)(ii-P->genomeSAindexStart[iL]) && indArray[2*iSJ]<iSA2) {
+                while (ind1 < (int64)(ii-P->genomeSAindexStart[iL]) && indArray[2*iSJ]-1<iSA2) {
                     ++iSJ;
                     ind1=funCalcSAi(Gsj+indArray[2*iSJ+1],iL);
                 };
                 if (ind1 == (int64)(ii-P->genomeSAindexStart[iL]) ) {
-                    SAi.writePacked(ii,indArray[2*iSJ]+iSJ+1);
+                    SAi.writePacked(ii,indArray[2*iSJ]-1+iSJ+1);
                     for (uint ii0=ind0+1; ii0<ii; ii0++) {//fill all the absent indices with this value
-                        SAi.writePacked(ii0,(indArray[2*iSJ]+iSJ+1) | P->SAiMarkAbsentMaskC);
+                        SAi.writePacked(ii0,(indArray[2*iSJ]-1+iSJ+1) | P->SAiMarkAbsentMaskC);
                     };
                     ++iSJ;
                     ind0=ii;
@@ -255,11 +231,11 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
                 };
             } else 
             {//index was present in the old genome
-                while (iSJ<nInd && indArray[2*iSJ]+1<iSA2) {//for this index insert "smaller" junctions
+                while (iSJ<nInd && indArray[2*iSJ]-1+1<iSA2) {//for this index insert "smaller" junctions
                     ++iSJ;
                 };
                 
-                while (iSJ<nInd && indArray[2*iSJ]+1==iSA2) {//special case, the index falls right behind SAi
+                while (iSJ<nInd && indArray[2*iSJ]-1+1==iSA2) {//special case, the index falls right behind SAi
                     if (funCalcSAi(Gsj+indArray[2*iSJ+1],iL) >= (int64) (ii-P->genomeSAindexStart[iL]) ) {//this belongs to the next index
                         break;
                     };
@@ -276,7 +252,6 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
         };
 
     };
-//     time ( &rawtime );    cout << timeMonthDayTime(rawtime) << "SAi first" <<endl;
 
     for (uint isj=0;isj<nInd;isj++) {
         int64 ind1=0;
@@ -315,16 +290,16 @@ void sjdbBuildIndex (Parameters *P, Parameters *P1, char *Gsj, char *G, PackedAr
     PackedArray SAio=SAi;
     SAio.allocateArray();
     ifstream oldSAiin("./DirTrue/SAindex");
-//     oldSAin.read(SAio.charArray,8*(P->genomeSAindexNbases+2));//skip first bytes
+    oldSAiin.read(SAio.charArray,8*(P->genomeSAindexNbases+2));//skip first bytes
     oldSAiin.read(SAio.charArray,SAio.lengthByte);
     oldSAiin.close();  
     
 
-//     for (uint ii=0;ii<P->nSA;ii++) {
-//         if (SA2[ii]!=SAo[ii]) {
-//             cout <<ii <<" "<< SA2[ii]<<" "<<SAo[ii]<<endl;
-//         };
-//     };
+    for (uint ii=0;ii<P->nSA;ii++) {
+        if (SA2[ii]!=SAo[ii]) {
+            cout <<ii <<" "<< SA2[ii]<<" "<<SAo[ii]<<endl;
+        };
+    };
 
 
     for (uint iL=0; iL < P->genomeSAindexNbases; iL++) {
diff --git a/source/sjdbInsertJunctions.cpp b/source/sjdbInsertJunctions.cpp
index d9f2b76..8ef7dc8 100644
--- a/source/sjdbInsertJunctions.cpp
+++ b/source/sjdbInsertJunctions.cpp
@@ -14,8 +14,7 @@ void sjdbInsertJunctions(Parameters * P, Parameters * P1, Genome & genome, SjdbC
 
     if (P->sjdbN>0 && sjdbLoci.chr.size()==0)
     {//load from the saved genome, only if the loading did not happen already (if sjdb insertion happens at the 1st pass, sjdbLoci will be populated
-        ifstream sjdbStreamIn;
-        ifstrOpen(P->genomeDir+"/sjdbList.out.tab", "ERROR_012003", "SOLUTION: re-generate the genome in genomeDir=" + P->genomeDir, P, sjdbStreamIn);
+        ifstream & sjdbStreamIn = ifstrOpen(P->genomeDir+"/sjdbList.out.tab", ERROR_OUT, "SOLUTION: re-generate the genome in genomeDir=" + P->genomeDir, P);
         sjdbLoadFromStream(sjdbStreamIn, sjdbLoci);
         sjdbLoci.priority.resize(sjdbLoci.chr.size(),30);
         time ( &rawtime );
@@ -84,22 +83,21 @@ void sjdbInsertJunctions(Parameters * P, Parameters * P1, Genome & genome, SjdbC
             copyFile(P->genomeDir+"/chrLength.txt", P->sjdbInsert.outDir+"/chrLength.txt");
         };
         
-        genomeParametersWrite(P->sjdbInsert.outDir+("/genomeParameters.txt"), P, "ERROR_012012");
+        genomeParametersWrite(P->sjdbInsert.outDir+("/genomeParameters.txt"), P, ERROR_OUT);
         
-        ofstream genomeOut;
-        ofstrOpen(P->sjdbInsert.outDir+"/Genome","ERROR_012004", P, genomeOut);
-        fstreamWriteBig(genomeOut,genome.G,P->nGenome,P->sjdbInsert.outDir+"/Genome","ERROR_012005",P);
+        ofstream & genomeOut = ofstrOpen(P->sjdbInsert.outDir+"/Genome",ERROR_OUT, P);
+        fstreamWriteBig(genomeOut,genome.G,P->nGenome,P->sjdbInsert.outDir+"/Genome",ERROR_OUT,P);
         genomeOut.close();
 
-        ofstrOpen(P->sjdbInsert.outDir+"/SA","ERROR_012006", P, genomeOut);
-        fstreamWriteBig(genomeOut,(char*) genome.SA.charArray, (streamsize) genome.SA.lengthByte, P->sjdbInsert.outDir+"/SA","ERROR_012007",P);
-        genomeOut.close();
+        ofstream & saOut = ofstrOpen(P->sjdbInsert.outDir+"/SA",ERROR_OUT, P);
+        fstreamWriteBig(saOut,(char*) genome.SA.charArray, (streamsize) genome.SA.lengthByte, P->sjdbInsert.outDir+"/SA",ERROR_OUT,P);
+        saOut.close();
 
-        ofstrOpen(P->sjdbInsert.outDir+"/SAindex","ERROR_012008", P, genomeOut);
-        fstreamWriteBig(genomeOut, (char*) &P->genomeSAindexNbases, sizeof(P->genomeSAindexNbases),P->sjdbInsert.outDir+"/SAindex","ERROR_012009",P);
-        fstreamWriteBig(genomeOut, (char*) P->genomeSAindexStart, sizeof(P->genomeSAindexStart[0])*(P->genomeSAindexNbases+1),P->sjdbInsert.outDir+"/SAindex","ERROR_012010",P);
-        fstreamWriteBig(genomeOut,  genome.SAi.charArray, genome.SAi.lengthByte,P->sjdbInsert.outDir+"/SAindex","ERROR_012011",P);
-        genomeOut.close();
+        ofstream & saIndexOut = ofstrOpen(P->sjdbInsert.outDir+"/SAindex",ERROR_OUT, P);
+        fstreamWriteBig(saIndexOut, (char*) &P->genomeSAindexNbases, sizeof(P->genomeSAindexNbases),P->sjdbInsert.outDir+"/SAindex",ERROR_OUT,P);
+        fstreamWriteBig(saIndexOut, (char*) P->genomeSAindexStart, sizeof(P->genomeSAindexStart[0])*(P->genomeSAindexNbases+1),P->sjdbInsert.outDir+"/SAindex",ERROR_OUT,P);
+        fstreamWriteBig(saIndexOut,  genome.SAi.charArray, genome.SAi.lengthByte,P->sjdbInsert.outDir+"/SAindex",ERROR_OUT,P);
+        saIndexOut.close();
     };
 
     //re-calculate genome-related parameters
diff --git a/source/stitchAlignToTranscript.cpp b/source/stitchAlignToTranscript.cpp
index aec7a3f..45d1085 100644
--- a/source/stitchAlignToTranscript.cpp
+++ b/source/stitchAlignToTranscript.cpp
@@ -299,7 +299,7 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
                 
         #else
             if ( (trA->nMM + nMM)<=outFilterMismatchNmaxTotal  \
-                         && (nMM==0 || jCan<0 || jCan==1 || jCan==2) ) 
+                         && ( jCan<0 || (jCan<7 && nMM<=P->alignSJstitchMismatchNmax[(jCan+1)/2]) ) ) 
         #endif
             {//stitching worked only if there no mis-matches for non-GT/AG junctions
                 trA->nMM += nMM;
@@ -358,7 +358,8 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
 
             
             trExtend.reset();
-            if ( extendAlign(R, Q, G, rAend+1, gAend+1, 1, 1, DEF_readSeqLengthMax, trA->nMatch, trA->nMM, outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax1, &trExtend) ) {
+            if ( extendAlign(R, Q, G, rAend+1, gAend+1, 1, 1, DEF_readSeqLengthMax, trA->nMatch, trA->nMM, outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax, \
+                             P->alignEndsType.ext[trA->exons[trA->nExons-1][EX_iFrag]][1], &trExtend) ) {
 
                 trA->add(&trExtend);
                 Score += trExtend.maxScore;
@@ -372,7 +373,11 @@ intScore stitchAlignToTranscript(uint rAend, uint gAend, uint rBstart, uint gBst
             trA->nMatch += L;
 
             trExtend.reset();
-            if ( extendAlign(R, Q, G, rBstart-1, gBstart-1, -1, -1, gBstart-trA->exons[0][EX_G]+trA->exons[0][EX_R], trA->nMatch, trA->nMM, outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax1, &trExtend) ) {
+//             if ( extendAlign(R, Q, G, rBstart-1, gBstart-1, -1, -1, gBstart-trA->exons[0][EX_G]+trA->exons[0][EX_R], trA->nMatch, trA->nMM, outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax, \
+            //if end extension needs to be forced, use large length. Otherwise, only extend until the beginning of the transcript
+            uint extlen=P->alignEndsType.ext[iFragB][1] ? DEF_readSeqLengthMax : gBstart-trA->exons[0][EX_G]+trA->exons[0][EX_R];
+            if ( extendAlign(R, Q, G, rBstart-1, gBstart-1, -1, -1, extlen, trA->nMatch, trA->nMM, outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax, \
+                             P->alignEndsType.ext[iFragB][1], &trExtend) ) {
 
                 trA->add(&trExtend);
                 Score += trExtend.maxScore;               
diff --git a/source/stitchGapIndel.cpp b/source/stitchGapIndel.cpp
index 3f0986f..55aab06 100644
--- a/source/stitchGapIndel.cpp
+++ b/source/stitchGapIndel.cpp
@@ -1,3 +1,6 @@
+#include "IncludeDefine.h"                                                                                                                                                     
+#include "Parameters.h"
+
 int stitchGapIndel (uint rAend, uint gAend, uint rBstart, uint gBstart, uint L, uint gapStart, uint gapEnd, char* R, char* G, Parameters* P,\
                     uint &iRbest, uint &nMM){//returns stitch score
     
diff --git a/source/stitchWindowAligns.cpp b/source/stitchWindowAligns.cpp
index c6a3cd1..8aa282e 100644
--- a/source/stitchWindowAligns.cpp
+++ b/source/stitchWindowAligns.cpp
@@ -38,16 +38,11 @@ void stitchWindowAligns(uint iA, uint nA, int Score, bool WAincl[], uint tR2, ui
             
             case 0: //extend at start
 
-            if (trA.rStart>0) {// if transcript does not start at base, extend to the read start 
-
-                //calculate # of allowed mismatches that has been left
-               
-                
-                double pMMmax=(P->alignEndsType=="Extend5pOfRead1" && trA.exons[0][EX_iFrag]==0 && trA.Str==0) ? -1 : P->outFilterMismatchNoverLmax1;
-                
+            if (trA.rStart>0) {// if transcript does not start at base, extend to the read start                
                 trAstep1.reset();
-                //                                                            //avoid extending before Chr start
-                if ( extendAlign(R, Q, G, trA.rStart-1, trA.gStart-1, -1, -1, min(trA.rStart, trA.gStart - P->chrStart[trA.Chr]), tR2-trA.rStart+1, trA.nMM, RA->outFilterMismatchNmaxTotal, pMMmax, &trAstep1) ) {//if could extend
+                if ( extendAlign(R, Q, G, trA.rStart-1, trA.gStart-1, -1, -1, trA.rStart, tR2-trA.rStart+1, \
+                                 trA.nMM, RA->outFilterMismatchNmaxTotal, P->outFilterMismatchNoverLmax, \
+                                 P->alignEndsType.ext[trA.exons[0][EX_iFrag]][trA.Str], &trAstep1) ) {//if could extend
         
                     trA.add(&trAstep1);
                     Score += trAstep1.maxScore;
@@ -64,14 +59,10 @@ void stitchWindowAligns(uint iA, uint nA, int Score, bool WAincl[], uint tR2, ui
             case 1: //extend at end
 
             if ( tR2<Lread ) {//extend alignment to the read end
-
-                //calculate # of allowed mismatches that has been left
-                
-                double pMMmax=(P->alignEndsType=="Extend5pOfRead1" && trA.exons[trA.nExons-1][EX_iFrag]==0 && trA.Str==0) ? -1 : P->outFilterMismatchNoverLmax1;
-                
                 trAstep1.reset();            
-                //                                              //to prevent extension past the Chr end
-                if ( extendAlign(R, Q, G, tR2+1, tG2+1, +1, +1, min(Lread-tR2-1,P->chrStart[trA.Chr+1]-tG2-2), tR2-trA.rStart+1, trA.nMM, RA->outFilterMismatchNmaxTotal, pMMmax, &trAstep1) ) {//if could extend
+                if ( extendAlign(R, Q, G, tR2+1, tG2+1, +1, +1, Lread-tR2-1, tR2-trA.rStart+1, \
+                                 trA.nMM, RA->outFilterMismatchNmaxTotal,  P->outFilterMismatchNoverLmax, \
+                                 P->alignEndsType.ext[trA.exons[trA.nExons-1][EX_iFrag]][1-trA.Str], &trAstep1) ) {//if could extend
                     
                     trA.add(&trAstep1);
                     Score += trAstep1.maxScore;
@@ -247,13 +238,13 @@ void stitchWindowAligns(uint iA, uint nA, int Score, bool WAincl[], uint tR2, ui
                 //OR within the score range of each mate
                 //OR all transcript if chimeric detection is activated
             
-            if (P->outFilterMismatchNoverLmax1<0) {//check that the alignment is end-to-end
-                uint rTotal=trA.rLength+trA.lIns;
-//                 for (uint iex=1;iex<trA.nExons;iex++) {//find the inside exons
-//                     rTotal+=trA.exons[iex][EX_R]-trA.exons[iex-1][EX_R];
-//                 };                
-                if ( (trA.iFrag<0 && rTotal<(RA->readLength[0]+RA->readLength[1])) || (trA.iFrag>=0 && rTotal<RA->readLength[trA.iFrag])) return;
-            };
+//             if (P->alignEndsType.in=="EndToEnd") {//check that the alignment is end-to-end
+//                 uint rTotal=trA.rLength+trA.lIns;
+// //                 for (uint iex=1;iex<trA.nExons;iex++) {//find the inside exons
+// //                     rTotal+=trA.exons[iex][EX_R]-trA.exons[iex-1][EX_R];
+// //                 };                
+//                 if ( (trA.iFrag<0 && rTotal<(RA->readLength[0]+RA->readLength[1])) || (trA.iFrag>=0 && rTotal<RA->readLength[trA.iFrag])) return;
+//             };
             
             uint iTr=0; //transcript insertion/replacement place
           
diff --git a/source/streamFuns.cpp b/source/streamFuns.cpp
index 04f884e..0408971 100644
--- a/source/streamFuns.cpp
+++ b/source/streamFuns.cpp
@@ -58,8 +58,8 @@ void fstreamWriteBig(std::ofstream &S, char* A, unsigned long long N, std::strin
     P->inOut->logMain << " done\n" <<flush;
 };
 
-void ofstrOpen (std::string fileName, std::string errorID, Parameters *P, ofstream & ofStream) {//open file 'fileName', generate error if cannot open
-    ofStream.open(fileName.c_str(), std::fstream::out | std::fstream::trunc);
+std::ofstream & ofstrOpen (std::string fileName, std::string errorID, Parameters *P) {//open file 'fileName', generate error if cannot open
+    std::ofstream & ofStream = *new std::ofstream(fileName.c_str(), std::fstream::out | std::fstream::trunc);
     if (ofStream.fail()) {//
 //         dir1=fileName.substr(0,fileName.find_last_of("/")+1);
 //         if (dir1=="") dir1="./";
@@ -68,12 +68,13 @@ void ofstrOpen (std::string fileName, std::string errorID, Parameters *P, ofstre
         errOut << "Solution: check that the path exists and you have write permission for this file\n";
         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_FILE_OPEN, *P);
     };    
+    return ofStream;
 };
 
 
-void ifstrOpen (std::string fileName, std::string errorID, std::string solutionString, Parameters *P, ifstream & ifStream) {
+std::ifstream & ifstrOpen (std::string fileName, std::string errorID, std::string solutionString, Parameters *P) {
     //open file 'fileName', generate error if cannot open
-    ifStream.open(fileName.c_str());
+    std::ifstream & ifStream = *new std::ifstream(fileName.c_str());
     if (ifStream.fail()) {//
         ostringstream errOut;
         errOut << errorID<<": exiting because of *INPUT FILE* error: could not open input file "<< fileName <<"\n";
@@ -83,11 +84,12 @@ void ifstrOpen (std::string fileName, std::string errorID, std::string solutionS
         };
         exitWithError(errOut.str(),std::cerr, P->inOut->logMain, EXIT_CODE_FILE_OPEN, *P);
     };    
+    return ifStream;
 };
 
-void ifstrOpenGenomeFile (std::string fileName, std::string errorID, Parameters *P, ifstream & ifStream) {
+ifstream & ifstrOpenGenomeFile (std::string fileName, std::string errorID, Parameters *P) {
      //open one of the genome files
-     ifstrOpen(P->genomeDir+"/"+fileName, errorID,  "if this file is missing from the genome directory, you will need to *re-generate the genome*", P, ifStream);
+     return ifstrOpen(P->genomeDir+"/"+fileName, errorID,  "if this file is missing from the genome directory, you will need to *re-generate the genome*", P);
 };
 
 void copyFile(string fileIn, string fileOut)
diff --git a/source/streamFuns.h b/source/streamFuns.h
index 5437eb1..958fe1a 100644
--- a/source/streamFuns.h
+++ b/source/streamFuns.h
@@ -7,9 +7,9 @@
 unsigned long long fstreamReadBig(std::ifstream &S, char* A, unsigned long long N);
 void fstreamWriteBig(std::ofstream &S, char* A, unsigned long long N, std::string fileName, std::string errorID, Parameters *P) ;
 
-void ofstrOpen (std::string fileName, std::string errorID, Parameters *P, ofstream & ofStream);
-void ifstrOpen (std::string fileName, std::string errorID, std::string solutionString, Parameters *P, ifstream & ofStream);
-void ifstrOpenGenomeFile (std::string fileName, std::string errorID, Parameters *P, ifstream & ifStream);
+ofstream & ofstrOpen (std::string fileName, std::string errorID, Parameters *P);
+ifstream & ifstrOpen (std::string fileName, std::string errorID, std::string solutionString, Parameters *P);
+ifstream & ifstrOpenGenomeFile (std::string fileName, std::string errorID, Parameters *P);
 
 void copyFile(string fileIn, string fileOut);
 #endif

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/rna-star.git



More information about the debian-med-commit mailing list